久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

正則表達式要點有哪些

162次閱讀
沒有評論

共計 5001 個字符,預計需要花費 13 分鐘才能閱讀完成。

這篇文章主要介紹正則表達式要點有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

正則表達式(Regular
Expression)是強大、便捷、高效的文本處理工具。

正則表達式的元字符與其他字符結合起來,實現我們期望的功能。

典型元字符:

^    脫字符,一行的起始,匹配的是行開始的位置

$    美元符,一行的結束,匹配的是行結尾的位置

|    豎線、管道,多選結構,匹配分隔兩邊的任意子表達式

(…)   括號,限制豎線(管道)的作用范圍,單用 grep 不支持,需用 grep - E 或 egrep

[…]    字符組,匹配里面的若干字符之一(正則表達式結構體 Construct[],列出在某處期望匹配的字符)

[^…]   排除型字符組,匹配未列出的任意字符

– 
  連字符,表示一個范圍,用于字符組內部時才是元字符

.    點號,單個任意字符,用來匹配任意字符的字符組的簡便寫法

\   反斜線小于,單詞分界符 \ 用于匹配單詞(字符組合,字母數字符號)開頭的位置

\   反斜線大于,單詞分界符 \ 用于匹配單詞(字符組合,字母數字符號)結束的位置

同一字符在不同位置,含義可能不一樣,需注意區分。加參數 - i 表示匹配時不區分大小寫。

實例分析:

cat  尋找一行文本中任意位置的 cat,如 cat、catalog、scat、scatter

^cat  尋找行首的 cat,如 catalog

cat$  尋找行尾的 cat,如 scat

^cat$ 
  只包含 cat 的行

^$ 
  空行,沒有任何字符(包括空白字符)


  單獨使用無意義

\ cat\   匹配單詞 cat

 

^(From|Subject):  表示尋找以 From: 或者 Subject: 開頭的行

包含型字符組:[123456]  匹配 1 到 6 中的任意一個數字

H[123456]   匹配 H1 ~ H6,可以寫成 H[1-6],- 為連字符,用于字符組內部時,表示一個范圍。

[0-9]  匹配一個數字

[a-z]  匹配一個小寫字母

[A-Z]  匹配一個大寫字母

[0-9A-Z_!.?]  匹配一個數字、大寫字母、下劃線、驚嘆號、點或問號

[0123456789abcdefABCDEF]  可以寫成 [0-9a-fA-F] 或者[A-Fa-f0-9],順序無所謂,適合處理 16 進制數字

 

[abc]、[a-c]、(a|b|c)表示同一個意思,但不是所有字符都可以這樣表示。字符組效率相對較高。

排除型字符組:[^…]  匹配任何未列出的字符,字符組內部開頭的 ^ 表示排除(negate),列出不希望匹配的字符

n[^d]  匹配 n 后面不是字符 d 的行

[^d]  匹配不是僅包含字母 d 的行,即排除僅包含字母 d 的行

 

排除型字符組表示“匹配未列出的字符(match a character that’s not listed)”,而不是“不要匹配列出的字符(don’t match what is listed)”。

匹配文件目錄 / 路徑的方法:

./([^/]+)/  匹配./ 后面不是只有 / 但可以是其他字符(出現次數不限)的行,最后面還有 /

實測發現此正則表達式還不夠嚴謹

因為. 是匹配單個任意字符(不一定是.  還可能是字母或其它字符)

若要匹配單獨的.  需要加轉義符 \ 或者脫字符 ^

實例:
[root@CentOS6 shell]# grep -E \./([^/]+)/ dir.txt   # 加轉義符 \

./home/

./…yes../

./new/

./100/

./ 中國 /

./2015/

./2014-12-31/

[root@CentOS6 shell]# grep -E ^./([^/]+)/$ dir.txt  #加行首行尾錨定符 ^ 和 $

./home/

./…yes../

./new/

./100/

./ 中國 /

./2015/

./2014-12-31/

[root@CentOS6 shell]# cat dir.txt

//

.//

./home/

./…yes../

.//~/

./new/

./100/

./ 中國 /

./2015/

./2014-12-31/

/hometown/

yesterday

@China

.///

.////

.//~/~/

abcd//~/

..//../

[root@CentOS6 shell]#

用點號. 匹配任意字符:

元字符.(也稱點號 dot、小點 point)是用來匹配任意字符的字符組的簡便寫法。

如果需要在表達式中使用一個“匹配任意字符”的占位符(placeholder),用點號. 就很方便。

例如:

要搜索 03/19/76、03-19-76、03-19-76,表達式可以寫成字符組形式:03[-./]19[-./]76

也可以使用點號. 替代字符組:03.19.76

相對而言,03[-./]19[-./]76 更精確,03.19.76 里的點號. 匹配到還可能是其他字符。具體用哪個取決于目標文本的情況。

 

字符組內的點號. 不是元字符,僅代表普通的點字符;

在字符組內的連字符 -,是否表示范圍要看其所在位置,在開頭或結尾都不是表示范圍,在中間(且不是在 [^ 后面)的才是。例如:[.-/] 中 - 是表示范圍,但 [^-/.]、[./-] 里的 - 都不是表示范圍。

管道 | 多選結構:匹配任意子表達式

| 也是一個元字符,意為或(or),通過它可以把不同的子表達式組合成一個總的表達式,在這樣的組合中,子表達式稱為“多選分支(alternative)”。

 

如:gr[ea]y  可以采用 | 寫成 grey|gray,或者 gr(a|e)y。

注意不要寫成 gr[a|e]y,這里面的 | 只是普通的字符,因為在字符組內部。

 

多選結構可以包括很多字符,但不能超越括號的界限。

一個字符組只能匹配目標文本中的單個字符,而每個多選結構自身都可能是完整的正則表達式,都可以匹配任意長度的文本。

 

(first|1st)與(fir|1)st    同一意思

(First|1st) [Ss]treet 與(Fir|1)st [Ss]treet    同一意思

在一個包含多選結構的表達式中使用脫字符 ^ 和美元符 $ 的時候要小心。

分析:

^From|Subject|Date:    匹配 ^From 或 Subject 或 Date:

^(From|Subject|Date):  匹配 ^From: 或 ^Subjec: 或 ^Date:  常用于提取 E -mail 文件中的信息

兩者的匹配結果是不一樣的。

如果希望在每個多選分支之前都有脫字符 ^,之后都有:,需要使用括號來限制(constrain)這些多選分支。

 

典型用法:

grep -E From:|Subject: test.txt

grep -E ^(From|Subject|Date): test.txt  // 單引號、雙引號都可以,擴展正則

egrep ^(From|Subject|Date): test.txt

元字符序列 \ 和 \ 單詞分界符:

使用正則表達式時經常會遇到一個問題,就是期望匹配的“單詞”包含在另一個單詞之中。

 

單詞分界符 \ 和 \ 用于匹配單詞開頭和結束的位置。注意:和 本身并不是元字符,只有當它們與斜線 \ 結合起來的時候,整個序列才有特殊意義(稱為元字符序列)。不是所有的 egrep 版本都支持單詞分界符。

 

分析:

\ cat\ 意為匹配單詞的開頭位置,然后是 c a t 這 3 個字母,之后是單詞的結束位置,簡單的說就是匹配 cat 這個單詞。

也可以用 \ cat 和 cat\ 來分別匹配以單詞(或者說字母組合)cat 開頭和結束的單詞。

 

egrep(相當于 grep -E)認定的單詞開頭位置用向上的箭頭標識,單詞結束位置用向下的箭頭標識。

“單詞的開始和結束”準確地說是“字母數字字符號的開始和結束”。

 

可選項元素、通配符 Wildcards:

optional
items 可選項元素

 

問號?  代表可選項,表示任意單個字符,把它加在一個字符的后面,就表示此處容許出現這個字符,不過它的出現并非匹配成功的必要條件。哪個字符可選,? 就放在哪個字符后面。需要使用 egrep 或 grep -E。

 

color、colour    可以通過 colou?r 來匹配

July、Jul  可以通過 July? 或 (July|Jul) 來匹配

fourth|4th|4  可以通過 fourth|4(th)? 來匹配   嵌套了括號,問號? 作用的對象是整個括號內的內容。

括號及反向引用

括號的用途:

1、限制多選項的范圍

2、將若干字符組合為一個單元,受問號? 或星號 * 之類量詞的作用,如 four(th)?、(a)*

3、反向引用 backreference  容許匹配與表達式先前部分匹配的同樣的文本

例如:\ ([A-Za-z]+).+\1\     這里的括號 () 和 \1 用于支持反向引用

 

在支持反向引用的工具軟件中,括號 () 能夠“記憶”其中的子表達式匹配的文本,不論這些文本是什么,元字符序列 \1 都能記住它們。而且,在一個表達式中可以使用多個括號,在用 \1、\2、\3 等來表示第一、第二、第三組括號匹配的文本。括號是按照開括號“(”從左至右的出現順序進行的。

例如:([a-z])([0-9])\1\2 中的 \1 代表 [a-z] 匹配的內容,\2 代表 [0-9] 匹配的內容。

 

轉義

. 本身是元字符,它可以匹配任何字符,包括空格。

真正匹配文本中點號. 的元序列應該是反斜線(backslash)加上點號的組合:

aga\.att\.com

\. 稱為“轉義的點號”或“轉義的句號”,這種方法適用于所有的元字符,但在字符組內部無效。

這樣使用的反斜線成為“轉義符(escape)”——它作用的元字符會失去特殊含義,成為普通字符。

還可以用 \([a-zA-Z]+\)來匹配一個括號內的單詞,例如(very),在開閉括號之前的反斜線消除了開閉括號的特殊意義,于是能夠匹配文本中的開閉括號。

變量名:

許多程序設計語言都有標識符(identifier,例如變量名)的概念。

標識符只包含字母、數字以及下劃線,但不能以數字開頭。

可以用[a-zA-Z_][a-zA-Z_0-9]* 來匹配標識符:

第一個字符組匹配可能出現的第一個字符;

第二個(包括對應的 *)匹配余下的字符。

引號內的字符串:

匹配引號內的字符串,最簡單的方法是使用表達式:”[^”]*”

 

兩端的引號用來匹配字符串開頭和結尾的引號。

在這兩個引號之間的文本可以包括雙引號之外的任何字符。

這里用 [^”] 來匹配除雙引號”之外的任何字符,用 * 來表示兩個引號之間可以存在任意數目的非雙引號字符。

美元金額(可能包含小數):

\$[0-9]+(\.[0-9][0-9])? 是一種匹配美元金額的辦法。

 

三個部分:\$、…+、(…)?

分別匹配一個美元符號、小數點前的數字(一個或一組數字)、小數點及其之后的數字(一個小數點和兩位數字),可以匹配 $100.1 之類的美元金額,但不能匹配 $1,100 這樣的金額,小數部分是可選的。

 

如果要匹配的是只包含價格而不含其他字符的行,可以在此表達式兩端加上 ^…$,即:

^\$[0-9]+(\.[0-9][0-9])?$  開頭為美元符 $,結尾為數字,且必須包含小數點,匹配結果與前者不同

這個表達式不能匹配 $.49。

 

因為:

^    脫字符,一行的起始,匹配的是行開始的位置

$    美元符,一行的結束,匹配的是行結尾的位置

網址 HTTP/HTML URL:

網址(Web URL)的形式可能有很多種,所以構造一個能夠匹配所以形式的 URL 的正則表達式很有難度。

但如果只要求匹配大多數常見的 URL,則相對比較簡單。

 

常見的 HTTP/HTML URL 樣式如下:

http://hostname/path.html(或 htm)

 

主機名(hostname)(如 www.yahoo.com)的規則比較復雜,但因為主機名一般跟在 http:// 之后,可以寫成:

[-a-z0-9_.]+ (可能應該是[-a-z0-9_.:]+)

path 部分的變換更多,需要寫成:

[-a-z0-9_:@ ?=+,.!/~*%$]*

注意:用作普通字符的連字符 - 必須放在字符組的開頭,用在字符組中間的是表示范圍的元字符。

 

綜合起來就是:

egrep -i‘\ http://[-a-z0-9_.:]+/[-a-z0-9_:@ ?=+,.!/~*%$]*\.html?\ files

 

更簡化的版本:

egrep -i‘\ http://[^]*\.html?\ files

可能匹配出一些錯誤結果,根據具體需求調整表達式即可。

 

以上是“正則表達式要點有哪些”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注丸趣 TV 行業資訊頻道!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-16發表,共計5001字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 台北县| 峨山| 洛扎县| 那坡县| 江油市| 渝中区| 双峰县| 阿拉善左旗| 民县| 客服| 射洪县| 元朗区| 大埔县| 铁岭市| 中方县| 临沧市| 盐城市| 镇安县| 鸡泽县| 蒙阴县| 金门县| 武胜县| 盐池县| 土默特左旗| 马龙县| 图们市| 通榆县| 白沙| 内丘县| 北川| 宁明县| 广汉市| 莒南县| 鄂伦春自治旗| 海安县| 游戏| 安龙县| 无棣县| 西宁市| 新宁县| 平阳县|