001_正則基礎之——捕獲組(capture group)


1        概述

1.1     什么是捕獲組

捕獲組就是把正則表達式中子表達式匹配的內容,保存到內存中以數字編號或顯式命名的組里,方便后面引用。當然,這種引用既可以是在正則表達式內部,也可以是在正則表達式外部。

捕獲組有兩種形式,一種是普通捕獲組,另一種是命名捕獲組,通常所說的捕獲組指的是普通捕獲組。語法如下:

普通捕獲組:(Expression)

命名捕獲組:(?<name>Expression)

普通捕獲組在大多數支持正則表達式的語言或工具中都是支持的,而命名捕獲組目前只有.NET、PHP、Python等部分語言支持,據說Java會在7.0中提供對這一特性的支持。上面給出的命名捕獲組的語法是.NET中的語法,另外在.NET中使用(?’name’Expression)與使用(?<name>Expression)是等價的。在PHP和Python中命名捕獲組語法為:(?P<name>Expression)。

另外需要說明的一點是,除(Expression)和(?<name>Expression)語法外,其它的(?...)語法都不是捕獲組。

1.2     捕獲組編號規則

編號規則指的是以數字為捕獲組進行編號的規則,在普通捕獲組或命名捕獲組單獨出現的正則表達式中,編號規則比較清晰,在普通捕獲組與命名捕獲組混合出現的正則表達式中,捕獲組的編號規則稍顯復雜。

在展開討論之前,需要說明的是,編號為0的捕獲組,指的是正則表達式整體,這一規則在支持捕獲組的語言中,基本上都是適用的。下面對其它編號規則逐一展開討論。

1.2.1  普通捕獲組編號規則

如果沒有顯式為捕獲組命名,即沒有使用命名捕獲組,那么需要按數字順序來訪問所有捕獲組。在只有普通捕獲組的情況下,捕獲組的編號是按照“(”出現的順序,從左到右,從1開始進行編號的 。

正則表達式:(\d{4})-(\d{2}-(\d\d))

  

上面的正則表達式可以用來匹配格式為yyyy-MM-dd的日期,為了在下表中得以區分,月和日分別采用了\d{2}和\d\d這兩種寫法。

用以上正則表達式匹配字符串:2008-12-31,匹配結果為:

編號

命名

捕獲組

匹配內容

0

 

(\d{4})-(\d{2}-(\d\d))

2008-12-31

1

 

(\d{4})

2008

2

 

(\d{2}-(\d\d))

12-31

3

 

(\d\d)

31

1.2.2  命名捕獲組編號規則

命名捕獲組通過顯式命名,可以通過組名方便的訪問到指定的組,而不需要去一個個的數編號,同時避免了在正則表達式擴展過程中,捕獲組的增加或減少對引用結果導致的不可控。

不過容易忽略的是,命名捕獲組也參與了編號的,在只有命名捕獲組的情況下,捕獲組的編號也是按照“(”出現的順序,從左到右,從1開始進行編號的 。

正則表達式:(?<year>\d{4})-(?<date>\d{2}-(?<day>\d\d))

 

 

用以上正則表達式匹配字符串:2008-12-31

匹配結果為:

編號

命名

捕獲組

匹配內容

0

 

(?<year>\d{4})-(?<date>\d{2}-(?<day>\d\d))

2008-12-31

1

year

(?<year>\d{4})

2008

2

date

(?<date>\d{2}-(?<day>\d\d))

12-31

3

day

(?<day>\d\d)

31

1.2.3  普通捕獲組與命名捕獲組混合編號規則

當一個正則表達式中,普通捕獲組與命名捕獲組混合出現時,捕獲組的編號規則稍顯復雜。對於其中的命名捕獲組,隨時都可以通過組名進行訪問,而對於普通捕獲組,則只能通過確定其編號后進行訪問。

混合方式的捕獲組編號,首先按照普通捕獲組中“(”出現的先后順序,從左到右,從1開始進行編號,當普通捕獲組編號完成后,再按命名捕獲組中“(”出現的先后順序,從左到右,接着普通捕獲組的編號值繼續進行編號。

也就是先忽略命名捕獲組,對普通捕獲組進行編號,當普通捕獲組完成編號后,再對命名捕獲組進行編號。

正則表達式:(\d{4})-(?<date>\d{2}-(\d\d))

 

 

用以上正則表達式匹配字符串:2008-12-31,匹配結果為:

編號

命名

捕獲組

匹配內容

0

 

(\d{4})-(?<date>\d{2}-(\d\d))

2008-12-31

1

 

(\d{4})

2008

3

date

(?<date>\d{2}-(\d\d))

12-31

2

 

(\d\d)

31

2       捕獲組的引用

對捕獲組的引用一般有以下幾種:

1)       正則表達式中,對前面捕獲組捕獲的內容進行引用,稱為反向引用;

2)       正則表達式中,(?(name)yes|no)的條件判斷結構;

3)       在程序中,對捕獲組捕獲內容的引用。

2.1     反向引用

捕獲組捕獲到的內容,不僅可以在正則表達式外部通過程序進行引用,也可以在正則表達式內部進行引用,這種引用方式就是反向引用。

反向引用的作用通常是用來查找或限定重復,限定指定標識配對出現等等。

對於普通捕獲組和命名捕獲組的引用,語法如下:

普通捕獲組反向引用:\k<number>,通常簡寫為\number

命名捕獲組反向引用:\k<name>或者\k'name'

普通捕獲組反向引用中number是十進制的數字,即捕獲組的編號;命名捕獲組反向引用中的name為命名捕獲組的組名。

反向引用涉及到的內容比較多,后續單獨說明。

#參考:http://blog.csdn.net/lxcnn/article/details/4146148


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM