使用小括號指定一個子表達式后,匹配這個子表達式的文本(也就是此分組捕獲的內(nèi)容)可以在表達式或其它程序中作進一步的處理。默認情況下,每個分組會自動擁有一個組號,規(guī)則是:從左向右,以分組的左括號為標志,第一個出現(xiàn)的分組的組號為 1,第二個為 2,以此類推。
后向引用用于重復搜索前面某個分組匹配的文本。例如,\1 代表分組 1 匹配的文本。難以理解?請看示例:
\b(\w+)\b\s+\1\b
可以用來匹配重復的單詞,像 go go, 或者 kitty kitty。這個表達式首先是一個單詞,也就是單詞開始處和結(jié)束處之間的多于一個的字母或數(shù)字(\b(\w+)\b
),這個單詞會被捕獲到編號為 1 的分組中,然后是 1 個或幾個空白符(\s+
),最后是分組 1 中捕獲的內(nèi)容(也就是前面匹配的那個單詞)(\1
)。
你也可以自己指定子表達式的組名。要指定一個子表達式的組名,請使用這樣的語法:(?<Word>\w+)
(或者把尖括號換成'也行:(?'Word'\w+))
,這樣就把\w+
的組名指定為 Word 了。要反向引用這個分組捕獲的內(nèi)容,你可以使用\k<Word>
,所以上一個例子也可以寫成這樣:\b(?<Word>\w+)\b\s+\k<Word>\b
。
使用小括號的時候,還有很多特定用途的語法。下面列出了最常用的一些:
分類 | 代碼/語法 | 說明 |
---|---|---|
捕獲 | (exp) | 匹配exp,并捕獲文本到自動命名的組里 |
(?<name>exp) | 匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp) | |
(?:exp) | 匹配exp,不捕獲匹配的文本,也不給此分組分配組號 | |
零寬斷言 | (?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 | |
(?!exp) | 匹配后面跟的不是exp的位置 | |
(?<!exp) | 匹配前面不是exp的位置 | |
注釋 | (?#comment) | 這種類型的分組不對正則表達式的處理產(chǎn)生任何影響,用于提供注釋讓人閱讀 |
我們已經(jīng)討論了前兩種語法。第三個(?:exp)不會改變正則表達式的處理方式,只是這樣的組匹配的內(nèi)容不會像前兩種那樣被捕獲到某個組里面,也不會擁有組號?!拔覟槭裁磿胍@樣做?”——好問題,你覺得為什么呢?
更多建議: