溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Perl正則表達式中字符與字符集有哪些

發(fā)布時間:2021-12-06 14:09:36 來源:億速云 閱讀:273 作者:小新 欄目:大數據

這篇文章將為大家詳細講解有關Perl正則表達式中字符與字符集有哪些,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

⑴元字符

正則表達式語言由兩種基本字符類型組成:原義文本字符和元字符(  metacharacter  )。原義文本字符也即要匹配的實際文本字符或者空格,而元字符是一個或一組代替一個或多個字符的字符,可以用來進行模糊匹配。常用的元字符及其表達式的含義如下表所示:

Perl正則表達式中字符與字符集有哪些

元字符的元(meta)實際上是通配的意思(但與linux的通配符不是一個體系)。在Perl中,反斜杠\就是一個特殊的元字符,要想匹配元字符本身(而不是他在正則表達式里面的含義),可以在相應的元字符之前加反斜杠,例如'\.'、'\*'、'\\'就分別匹配文本中的'.'、'*'、'\'。此外元字符^匹配行首,在集合字符[]內部表示補集,元字符$則匹配行尾。

⑵模式分組與捕獲

在  Perl  的正則表達式中,圓括號  ()  也是一個特殊的元字符,用來對字符串進行分組,很多元字符只對單個字符進行操作,進行分組后可對多個字符進行操作,如下所示:
fred+    #可匹配freddddd…(fred)+    #可匹配fredfredfred…
圓括號內也即模式組內的字符串也可以被反向引用來進行操作,被引用的模式組也被稱為捕獲組(  capture group  ),引用方法為反斜杠加捕獲組順序編號,如下所示:
(.)\1        #匹配一個任意字符并重復一次,也即匹配兩個連續(xù)的相同字符y(….) d\1      #匹配y開頭后面四個任意字符,d開頭也是相同這樣字符的兩個單詞,例如yabba dabbay(.)(.)\2\1      #匹配y開頭后面兩個任意字符,然后接下來是這兩個字符的倒序的單詞,這是匹配類似yabba的這種回文結構y((.)(.)\3\2) d\1    #嵌套結構的反向引用,這里匹配y開頭和d開頭具有四個字符回文結構的單詞組,例如yabba dabba
對于復雜嵌套結構的捕獲組編號,  Perl  有個很簡單的規(guī)則,只需根據從左到右左圓括號的順序即可。如果反向引用捕獲組編號后面緊跟著數字,為了消歧義可能需要更多的圓括號,而從  Perl 5.10  開始,反向引用可以使用  \g{n}  的格式,如下所示:  
(.)\g{1}11    #匹配類似于aa11這樣的字符

在這種格式寫法下,還可以使用相對位置進行編號:

(.)(.)\g{-1}11  #匹配類似于xaa11這樣的字符

相對反向引用使用負號來指左邊的捕獲組,-1則為在左邊最靠近引用位置的捕獲組,這種寫法避免了在另外加入括號之后所有編號都必須修改的窘況,更有利于程序維護。

很多時候我們僅僅是想填加括號進行分組,但是又不想修改所有反向引用的編號,可以只啟用圓括號的模式分組功能而關閉捕獲功能,在左圓括號內添加  ?:  修飾符,如下所示:
y(?:(.)(.)\2\1) d(?:(.)(.)\4\3)    #外層括號只起到模式分組作用,可以匹配類似yabba deffe結構的詞組

⑶字符集

字符集(character class)是指一組可能出現的字符,通過寫在方括號[]內的表達式進行表示,字符集可以匹配包含在集合內的單個字符。例如[abcxyz]可以匹配出現在字符串中的a、b、c、x、y、z中的任一個,相連的字符中間可以使用連字符-表示范圍,例如上式可以寫為[a-cx-z],如果在集合內包含連字符本身(而不是表示范圍的含義)則可以使用反斜杠轉義。對于ASCII字符可以使用反斜杠加八進制數字編碼進行表示,例如[\000-\177]會匹配全部127個ASCII字符。在集合中開頭添加脫字符^可以取補集,例如[^0-9]會匹配除數字以外的字符。對于Unicode字符集,除了可以像\x{2668}通過編碼進行匹配外,還可以通過Unicode屬性,例如很多字符屬于空白符Space、數字Digit等,那么匹配的表達式則為\p{Space}和\p{Digit}。

字符集的出現是為了簡寫正則表達式,字符集也可以縮寫例如\d可以代表[0-9],\w可以代表[a-zA-Z0-9_]。但在Perl從ASCII時代邁向Unicode時代之后,字符集的縮寫更加寬泛,\d除了可以匹配普通數字,還可以匹配其他語言里的各種數字寫法。從Perl 5.14開始,可以在正則表達式界定符后面添加修飾符a(關于界定符和修飾符詳見下一小節(jié)),則正則表達式嚴格按照ASCII編碼進行匹配,例如/\d/a則等同于/[0-9]/。字符集縮寫將小寫字母改為大寫字母即變?yōu)檠a集,例如ASCII編碼下\D可以代表[^0-9],此外很有意思的是[\d\D]將會匹配任何字符且包括換行符,這比'.'所包含的范圍更廣。

⑷元字符優(yōu)先級

和操作符或者函數一樣,正則表達式的元字符也存在優(yōu)先級問題。元字符優(yōu)先級規(guī)則如下所示:

①在此優(yōu)先級表的最頂端是括號(),在模式分組和反向引用的時候使用,括號內部的任何部分比括號外的部分結合更緊密;

②第二級是數量詞即星號(*), 加號(+),問號(?)以及由花括號表示的數量詞,如{5,15}、{3, }、{5}等,它們通常和前一項元素緊密結合;

③第三級的是錨定和序列(sequence),錨定包括開頭^、結尾$、詞界符\b、非詞界符\B,序列(一個元素緊接著一個元素)實際上是一種操作,雖然它沒有使用元字符;

④  優(yōu)先級最低的是豎線  |  ,表示或,由于其優(yōu)先級最低,它通常將模式劃分成幾個部分。

關于“Perl正則表達式中字符與字符集有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI