配色: 字号:
正则表达式之捕获组非捕获组介绍
2016-09-30 | 阅:  转:  |  分享 
  
正则表达式之捕获组/非捕获组介绍

使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。

捕获组语法:

字符 描述 示例 (pattern) 匹配pattern并捕获结果,自动设置组号。 (abc)+d

匹配abcd或者abcabcd (?pattern)



(?''name''pattern) 匹配pattern并捕获结果,设置name为组名。 \num 对捕获组的反向引用。其中num是一个正整数。 (\w)(\w)\2\1

匹配abba \k



\k''name'' 对命名捕获组的反向引用。其中name是捕获组名。 (?\w)abc\k

匹配xabcx

也可以自己指定子表达式的组名。这样在表达式或程序中可以直接引用组名,当然也可以继续使用组号。但如果正则表达式中同时存在普通捕获组和命名捕获组,那么捕获组的编号就要特别注意,编号的规则是先对普通捕获组进行编号,再对命名捕获组进行编号。例如:(\d{4})-(?\d{2}-(\d{2}))113223下面在程序中处理命名捕获组,显示混合规则生成的组号,并利用捕获组的内容对源字符串进行替换。可以看到先对普通捕获组进行编号,再对命名捕获组编号。Regex.Replace方法

复制代码代码如下:

usingSystem.Text.RegularExpressions;namespaceWuhong.Test{classProgram{staticvoidMain(string[]args){//目标字符串stringsource="reg-test-server:8080/download/file1.html#";//正则式,对其中两个分组命名stringregex=@"(\w+):\/\/(?[^/:]+)(?:\d+)?([^#:])";RegexregUrl=newRegex(regex);//匹配正则表达式Matchm=regUrl.Match(source);Console.WriteLine(m.Success);if(m.Success){//捕获组存放在Match.Groups集合中,索引值从1开始,索引0处为匹配的整个字符串值//按“组号:捕获内容”的格式显示for(inti=0;i


非捕获组语法:

字符 描述 示例 (?:pattern) 匹配pattern,但不捕获匹配结果。 ''industr(?:y|ies)

匹配''industry''或''industries''。 (?=pattern) 零宽度正向预查,不捕获匹配结果。 ''Windows(?=95|98|NT|2000)''

匹配"Windows2000"中的"Windows"

不匹配"Windows3.1"中的"Windows"。 (?!pattern) 零宽度负向预查,不捕获匹配结果。 ''Windows(?!95|98|NT|2000)''

匹配"Windows3.1"中的"Windows"

不匹配"Windows2000"中的"Windows"。 (?<=pattern) 零宽度正向回查,不捕获匹配结果。 ''2000(?<=Office|Word|Excel)''

匹配"Office2000"中的"2000"

不匹配"Windows2000"中的"2000"。 (?
匹配"Windows2000"中的"2000"

不匹配"Office2000"中的"2000"。 注释语法:

字符 描述 示例 (?#comment) comment是注释,不对正则表达式的处理产生任何影响 2[0-4]\d(?#200-249)|25[0-5](?#250-255)|1?\d\d?(?#0-199)

匹配0-255的整数

献花(0)
+1
(本文系白狐一梦首藏)