正則表達(dá)式之后向引用

2018-08-04 19:04 更新

當(dāng)我們使用小括號指定一個子表達(dá)式之后,就要對這個子表達(dá)式的文本進(jìn)行匹配,即此分組捕獲的內(nèi)容,可以在表達(dá)式或其它程序中作進(jìn)一步的處理。一般情況下,每個分組都會自動擁有一個組號,它的規(guī)則是:從左到右以分組的左括號作為標(biāo)志,把第一次出現(xiàn)的分組的組號定為1,第二個即2,以此類推下去。

后向引用用于重復(fù)搜索前面某個分組匹配的文本。例如,\1代表分組1匹配的文本。我們根據(jù)示例來深刻理解:

\b(\w+)\b\s+\1\b可以用來匹配重復(fù)的單詞,像go go, 或者kitty kitty。這個表達(dá)式首先是一個單詞,也就是單詞開始處和結(jié)束處之間的多于一個的字母或數(shù)字(\b(\w+)\b),這個單詞會被捕獲到編號為1的分組中,然后是1個或幾個空白符(\s+),最后是分組1中捕獲的內(nèi)容(也就是前面匹配的那個單詞)(\1)。

你也可以自己指定子表達(dá)式的組名。要指定一個子表達(dá)式的組名,請使用這樣的語法:(?<Word>\w+)(或者把尖括號換成'也行:(?'Word'\w+)),這樣就把\w+的組名指定為Word了。要反向引用這個分組捕獲的內(nèi)容,你可以使用\k<Word>,所以上一個例子也可以寫成這樣:\b(?<Word>\w+)\b\s+\k<Word>\b。

使用小括號的時候,還有很多特定用途的語法。下面列出了最常用的一些:

表4.常用分組語法
分類代碼/語法說明
捕獲(exp)匹配exp,并捕獲文本到自動命名的組里
(?<name>exp)匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)
(?:exp)匹配exp,不捕獲匹配的文本,也不給此分組分配組號
零寬斷言(?=exp)匹配exp前面的位置
(?<=exp)匹配exp后面的位置
(?!exp)匹配后面跟的不是exp的位置
(?<!exp)匹配前面不是exp的位置
注釋(?#comment)這種類型的分組不對正則表達(dá)式的處理產(chǎn)生任何影響,用于提供注釋讓人閱讀

我們已經(jīng)討論了前兩種語法。第三個(?:exp)不會改變正則表達(dá)式的處理方式,只是這樣的組匹配的內(nèi)容不會像前兩種那樣被捕獲到某個組里面,也不會擁有組號。“我為什么會想要這樣做?”——好問題,你覺得為什么呢?

注解:

其實(shí),組號分配還不像我剛說得那么簡單:

  • 分組0對應(yīng)整個正則表達(dá)式
  • 實(shí)際上組號分配過程是要從左向右掃描兩遍的:第一遍只給未命名組分配,第二遍只給命名組分配--因此所有命名組的組號都大于未命名的組號
  • 你可以使用(?:exp)這樣的語法來剝奪一個分組對組號分配的參與權(quán).



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號