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。
條件:(?(if)then |else)
If依賴於具體的實現,不過通常是捕獲子運算式或環顧(lookaround)的引用。而then和else都是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。