正則表示式之分組(捕獲)、後向引用
分組
正則表示式中的分組又稱為子表示式,就是把一個正則表示式的全部或部分當做一個整體進行
處理,分成一個或多個組。其中分組是使用“()”表示的。進行分組之後“()”裡面的內容就會被當
成一個整體來處理。
先看看一個具體的例子吧:
同時我們可以使用“()”限制替換的範圍
分組可以分為捕獲組和非捕獲組.
捕獲組
可以通過從左到右通過其括號對其進行編號:
需要注意的是組零永遠代表的是整個正則式,通過這樣命名儲存了匹配分組的匹配的序列,
捕獲的子序列就可以通過後向引用在表示式中使用了,也可以從匹配器中檢索。
至於後向引用其實就是對匹配組的一種快捷指令,用法後面會介紹.
非捕獲組
以 (?) 開頭的組是純的非捕獲 組,它不捕獲文字 ,也不針對組合計進行計數。就是說,
如果小括號中以?號開頭,那麼這個分組就不會捕獲文字,當然也不會有組的編號,因此
也不存在Back 引用。
測試匹配性 (?<!4)56(?=9) 這裡的含義就是匹配後面的文字56前面不能是4,後面必須
是9組成。因此,可以匹配如下文字 5569 ,與4569不匹配。
後向引用
當一個正則表示式被分組後,每個組將會自動的分配一個組號用於代表該組的表示式,
其中,組號的編制規則為:從左到右、以分組的左括號“(”為標誌,第一個分組的組號為1,
第二個分組的組號為2,以此類推。
反向引用提供查詢重複字元組的方便的方法。它們可被認為是再次匹配同一個字串的快捷指令。
如何理解呢?先看看一個例子吧。
1、匹配“javajava”
僅僅使用分組實現:(java)(java)
使用後向引用的方法:(java)\1
貌似上面也沒看出啥區別呀,在來一個例子
2、直接對比(\w)\1和(\w)(\w)的區別
該正則匹配的是出現兩次的字元.\1將重複匹配(\w)出現的內容!
該正則只是簡單的匹配兩個字元,注意區別!
再給個例子: