Regex和模式比對簡介(三)

來源:互聯網
上載者:User
Regex和模式比對簡介——注釋和模式變換

作者:張桂權

(摘自《

Regex袖珍手冊》一書。譯者,張桂權。可以從http://download.csdn.net/source/346896下載完整的譯稿。如果感覺不錯就去買一本原版的書吧,Regular Expression Pocket Reference,支援原書的作者。看PDF檔案也是很累的。看完之後別忘了,給我提寶貴意見哦。謝謝。ajax.mailer@gmail.com)

       模式變化改變Regex引擎解釋Regex的方式。(請參看MRE 110-113,135-136)

 

多行模式:m

       改變^和$的行為來匹配輸入字串中緊挨的換行。

 

單行模式:s

       改變點號(dot)的行為來匹配所有字元,包括輸入字串中的換行。

 

大小寫敏感模式:i

       以大小寫來唯一區分字母的不同。

 

 

自由調整間隔(Free-spacing)模式:x

       允許Regex中包含空格和注釋。空格和注釋(以#開始,到行末)被Regex引擎忽略。

 

模式變換器:(?!),(?-!),(?mod:...)

       一般情況下,可以通過(?mod)在Regex中設定模式變換器,它在後續的子運算式中生效。(?-mod)取消後續子運算式中的模式。(?mod:...)啟動或取消逗號和關括弧之間的模式。比如,使用(?:perl)匹配使用perl,使用Perl,使用PeRl等。

 

注釋:(?#...)和#

       在自由調整間隔的模式下,#表示這是一行注釋。當不支援#時,可以把(?#...)嵌入到Regex的任意位置,不論是什麼模式。例如,.{0,80}(?#Field limit is 80)允許你就自己的改寫原因做批註.{0,80}。

 

逐個文本跨度(Literal-text span):/Q...\E

       在/Q和/E之間迴避元字元。例如,/Q(.*)/E和/(/./*)等效。

 

分組、捕獲、條件和控制

       本節包括歸類子模式、捕獲子匹配、條件子匹配的文法和計運算元模式比對出現的次數。(請參看 MRE 137-142)

 

捕獲和歸類括弧:(...)和/1,/2

       括弧起到兩個作用:歸類和捕獲。括弧中被子模式比對的文本將在後面使用。通過從左至右的方式計算開括弧得到捕獲括弧的個數。如果允許反向參考,那麼可以通過/1,/2等在同一個匹配中引用子匹配。對於捕獲文本,可以通過依靠實現指定的方法來實現這種模式。例如,/b(/w+)/b/s+/1匹配重複的字,不如the the。

 

僅限于歸類的括弧:(?:…

       歸類一個子Regex是為了變換或計量,而不是捕獲一個子匹配。由於效率和高重用性,這一點非常有用。例如,(?:foobar)匹配foobar,但是不把它儲存到一個擷取的群組中。

 

命名捕獲:(?<name>…

       進行捕獲和歸類,然後用name了引用捕獲的文本。例如,Subject:(?<subject>.*)捕獲Subject之後的文本,並進行捕獲歸類,最後通過subject來引用文本。

 

自動歸類:(?>…)

       即使導致匹配失敗,也從不回溯組中匹配的文本。例如,(?>[ab]*)/w/w匹配aabbcc,擔不是aabbaa。

 

 

替換:… | …

       允許測試幾個子運算式。替換低優先順序有時可能造成子運算式比預期的還要大很多,所以最好用括弧指定你想要替換的內容。例如,/b(foo|bar)/b匹配foo或bar。

 

條件:(?ifthen |else

       If依賴於具體的實現,不過通常是捕獲子運算式或環顧(lookaround)的引用。而thenelse都是Regex模式。當if條件為真時,引用then,否則用else。例如,(<)?foo(?(1)|(bar))匹配foo和foobar。

 

貪婪計量器:*,+,?,{num, num}

       用貪婪計量器來檢測一個結構可以應用多少次。嘗試進行所有的匹配,但是如果已經成功匹配則可以回溯或放棄匹配。例如,(ab)+匹配所有的ababababab。

 

惰性計量器(Lazy quantifiers):*?,+?,??,{num, num}?

       惰性計量器控制一個結構可能應用的次數。但是不像貪婪計量器,它試圖進行儘可能少的匹配次數。例如,(an)+?僅匹配一次banana。

 

所有的計量器(Possessive quantifiers):*+,++,?+,{num, num}+

       所有的計量器像貪婪計量器,但是鎖上(“lock in”)她的匹配,不允許後面分解子匹配的回溯。例如,(ab)++ab不匹配ababababab。

 

Unicode支援

       Unicode字元集給世界上所有語言的每一個字元分配唯一的數字。因為可能字元的數量實在太大了,所以Unicode要求用不止一個位元組來表示一個字元。有些Regex的實現不支援Unicode字元,因為它們希望1個位元組的ASCII字元。Unicode字元的基礎支援,從逐字匹配一個Unicode字串開始。進階支援包括字元集和具體化所有支援Unicode語言的其他的結構。例如,/W既可能匹配è,也可能匹配e。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.