Expression)普通捕獲組在大多數支持正則表達式的語言或工具中都是支持的,而命名捕獲組目前只有.NET" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統 1550 0

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 為命名捕獲組的組名。

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

2.2 ???? 條件判斷表達式

條件判斷結構在平衡組中談到過,基本應用和擴展應用都可以在其中找到例子,這里不再贅述,請參考 .NET 正則基礎之 —— 平衡組 。

2.3 ???? 程序中引用

根據語言的不同,程序中對捕獲組引用的方式也有所不同,下面就 JavaScript .NET 進行舉例說明。

2.3.1 ? JavaScript 中的引用

由于 JavaScript 中不支持命名捕獲組,所以對于捕獲組的引用就只支持普通捕獲組的反向引用和 $number 方式的引用。程序中的引用一般在替換和匹配時使用。

注: 以下應用舉例僅考慮簡單應用場景,對于 < a href ="javascript:document.write('<b>hello</b>')"/> 這種復雜場景暫不考慮。

1) ???????? Replace 中引用,通常是通過 $number 方式引用。

舉例: 替換掉 html 標簽中的屬性。

< textarea id = "result" rows = "10" cols = "100" ></ textarea >

  

< script type = "text/javascript" >

  

var data = "<table id=/"test/"><tr class=/"light/"><td> test </td></tr></table>" ;

  

var reg = /<([a-z]+)[^>]*>/ig;

  

document.getElementById( "result" ).value = data.replace(reg, "<$1>" );

  

</ script >

  

// 輸出

  

<table><tr><td> test </td></tr></table>

2) ???????? 在匹配時的引用,通常通過 RegExp.$number 方式引用。

舉例: 同時獲取 <img…> 中的 src name 屬性值,屬性的順序不固定。參考 一條正則能不能同時取出一個 img 標記的 src name?

?

  1. <textarea?id= "result" ?rows= "10" ?cols= "100" ></textarea>???
  2. <script?type= "text/javascript" >???
  3. var ?data?=?[ '?<img?alt=""?border="0"?name="g6-o44-1"?onload="DrawImage"?src="/bmp/foo1.jpg"?/>' ,? '?<img?src="/bmp/foo2.jpg"?alt=""?border="0"?name="g6-o44-2"?onload="DrawImage"?/>' ]?;??
  4. var ?reg?=?/<img/b(?=(?:(?!name=).)*name=([ '"]?)([^' "/s>]+)/1)(?:(?!src=).)*src=([ '"]?)([^' "/s>]+)/3[^>]*>/i;??
  5. for ( var ?i=0;i<data.length;i++)??
  6. {??
  7. ???? var ?s?=?data[i];??
  8. ????document.getElementById( "result" ).value?+=? "源字符串:" ?+?s?+? "/n" ;??
  9. ????document.write( "<br?/>" );??
  10. ???? if (reg.test(s))??
  11. ????{??
  12. ????????document.getElementById( "result" ).value?+=? "name:?" ?+?RegExp.$2?+? "/n" ;??
  13. ????????document.getElementById( "result" ).value?+=? "src:?" ?+?RegExp.$4?+? "/n" ;??
  14. ????}??
  15. }??
  16. </script>??

<script type="text/javascript"></script>

?

?

?

2.3.2 ? .NET 中的引用

由于 .NET 支持命名捕獲組,所以在 .NET 中的引用方式會多一些。通常也是在兩種場景下應用,一是替換,一是匹配。

1) ???????? 替換中的引用

普通捕獲組: $number

命名捕獲組: ${name}

替換中應用,仍是上面的例子。

2) ???????? 匹配后的引用

對于匹配結果中捕獲組捕獲內容的引用,可以通過 Groups Result 對象進行引用。

對于捕獲組 0 的引用,可以簡寫作 m.Value 。

轉自:http://blog.csdn.net/lxcnn/article/details/4146148

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!??!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲精品久久久久久下一站 | 国产日韩精品一区二区 | 国产精品入口麻豆午夜 | 久久国内精品 | 涩色在线 | 色视频网站在线观看 | 天海翼一区 在线播放 | 在线看福利影 | www亚洲欲色成人久久精品 | 亚洲女人毛片 | 久久羞羞 | 久久国产精品99久久久久久牛牛 | 亚洲精品一区二区三区国产 | 曰本女人性配视频 | 久久香蕉国产线看观看精品蕉 | 欧美日日干 | 免费的毛片视频 | 日日摸夜夜爽人人添 | 国产精品久久久久久吹潮 | 国产一区日韩二区欧美三 | 国产一区精品在线 | 激情五月开心婷婷 | 欧美aaaa黄色一级毛片 | 九九热观看视频 | 色爱综合网欧美 | 欧美三级毛片 | 色九九 | 欧美在线观看高清一二三区 | 操操操干干 | 人做人爱视频欧美在线观看 | 国产精品伦视频观看免费 | 欧美福利视频在线观看 | 99精品影视 | 久久精品亚洲一区二区三区浴池 | 久久大香伊蕉在人线观看热2 | 午夜一级毛片看看 | 兽王高清完整在线观看 | 日本在线看片网站 | 国产精品久久久久久爽爽爽 | 欧美日本免费观看αv片 | 亚洲午夜综合网 |