正則表達式和模式匹配簡介(三)

正則表達式和模式匹配簡介——註釋和模式變換

作者:張桂權

(摘自《

正則表達式袖珍手冊》一書。譯者,張桂權。可以從http://download.csdn.net/source/346896下載完整的譯稿。如果感覺不錯就去買一本原版的書吧,Regular Expression Pocket Reference,支持原書的作者。看PDF文件也是很累的。看完之後別忘了,給我提寶貴意見哦。謝謝。[email protected]

       模式變化改變正則表達式引擎解釋正則表達式的方式。(請參看MRE 110-113135-136

 

多行模式:m

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

 

單行模式:s

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

 

大小寫敏感模式:i

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

 

 

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

       允許正則表達式中包含空格和註釋。空格和註釋(以#開始,到行末)被正則表達式引擎忽略。

 

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

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

 

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

       在自由調整間隔的模式下,#表示這是一行註釋。當不支持#時,可以把(?#...)嵌入到正則表達式的任意位置,不論是什麼模式。例如.{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

 

僅限於歸類的括號:(?:…

       歸類一個子正則表達式是爲了變換或計量,而不是捕獲一個子匹配。由於效率和高重用性,這一點非常有用。例如,(?:foobar)匹配foobar,但是不把它保存到一個捕獲組中。

 

命名捕獲:(?<name>…

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

 

自動歸類:(?>…)

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

 

 

替換:… | …

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

 

條件:(?ifthen |else

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

 

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

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

 

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

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

 

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

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

 

Unicode支持

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

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章