分組、反向引用和編號(命名)組


在正則表達式中,可以用一對(英文)圓括號創建一個分組。比如模式

([A-Z]+)(/d+)

[A-Z]+/d+

返回的匹配結果相同,但前者使用了兩對圓括號分組還捕獲了額外的兩個子字符串。舉例來說,如果用上面兩個模式來測試字符串 ABC123,那么第二個模式會返回 ABC123(因為匹配成功),而第一個模式除了返回 ABC123 這個匹配項之外,還會捕獲兩個組,第一個組中包含 ABC,而第二個組中包含 123。這兩個分組都是捕獲組――即捕獲匹配項中子字符串的組。

分組的作用表現在兩方面。一是用在同一模式后續的組件中,稱之為反向引用(back reference)。比如把上面第一個模式修改為

([A-Z]+)(/d+)/1

之后,就能夠匹配 ABC123ABC、A8A、AB25AB 等等類似的字符串。這個修正后的模式中的 /1 就叫做反向引用,數字 1 表示引用模式中的第一個捕獲組。也就是說,反向引用是在匹配模式中使用的一個概念(技術)。

反向引用比較典型的一個用法是匹配 XHTML 代碼中成對出現的開、閉標簽。比如,在 XHTML 中標題(<h1> 到 <h6>)元素有六個級別,如果你要匹配一個網頁中所有級別的標題元素就會用到反向引用。相應的模式可能是(假設標題中的文本只包含文字而不包含標點符號):

<(h[1-6])>/w+<//1>

這個模式的含義就是匹配 < 字符后跟 h 字符,后跟 1 到 6 中的任何一個數字,后跟 > 字符,后跟一或多個文字字符序列,后跟 < 字符,后跟正斜杠字符 /,后跟與第一個捕獲組相同的字符序列(如前面圓括號中是 h1 此處也必須是 h1),后跟 > 字符。此時,反向引用可以保證捕獲的標題元素是完整的,即是像 <h1>……</h1> 或 <h3>……</h3> 這樣完整的標簽對兒。這種情況下,如果不使用反向引用,而使用 <h[1-6]>/w+</h[1-6]> 就會得到不對稱的標簽對兒,如 <h1>……</h3> 。

分組的另一個用途是在替換模式中引用,稱之為編號(或命名)組。編號(命名)組的概念也是建立在匹配模式中的分組之上的。它與反向引用的區別在於,編號(命名)組是在替換模式中使用的一個概念(技術)。也就是說,編號(命名)組是在替換模式中引用匹配模式中分組的一種技術。比如,以模式

([A-Z]{3})(/d{2})

為例,該模式匹配 ABC12、DEF56 等等所有連續的三個大寫字母字符后跟兩個數字的字符序列。如果要在這些匹配的字符序列的字母與數字之間插入一個空格或者一個連字符作為分隔符,那么就可以在替換模式中使用編號組,比如:

$1-$2

其中 $1 包含與匹配模式中的組件 [A-Z]{3} 匹配的三個連續字母序列,而 $2 包含與 /d{2} 匹配的兩個數字。而 $1 和 $2 之間的 – 就是一個直接量連字符。

至於命名組並不是所有正則表達式實現都支持,只有少數的編程語言如 C#、VB.NET 中才支持。所謂命名組,就是在匹配模式中定義分組時為每個組命名,C# 中的語法是

(?<組名>模式)

然后在替換模式中就可以使用“組名”來引用該組了,對應的語法是

${組名}

命名組優於編號組是因為它讓人對替換模式中的引用更清楚、不致混淆。

綜上所述,正則表達式中的分組是基礎,反向引用和編號(命名)組是對相應分組的兩種不同的引用方式――反向引用是在匹配(或者說同一個)模式中引用分組,而編號(命名)組則是在替換模式中引用分組

注:有時候也將在替換模式中使用的編號(命名)組稱為反向引用。所以,可以認為無論是 /1 還是 $1 還是 ${date} ,只是因地制宜地使用了不同的形式而已,在本質上它們都是反向引用。

 

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com