首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

正则表达式-获取婚配和非获取匹配

2012-08-22 
正则表达式--获取匹配和非获取匹配??? 在使用正则表达式的时候,我们经常会使用()把某个部分括起来,称为一

正则表达式--获取匹配和非获取匹配

??? 在使用正则表达式的时候,我们经常会使用()把某个部分括起来,称为一个子模式。

?

??? 子模式有Capturing和Non-Capturing两种情况。

?

??? Capturing指获取匹配,是指系统会在幕后将所有的子模式匹配结果保存起来,供我们查找或者替换。如后向引用的使用;

??? 而Non-Capturing指非获取匹配,这时系统并不会保存子模式的匹配结果,子模式的匹配更多的只是作为一种限制条件使用,如正向预查,反向预查,负正向预查,负反向预查等。

?


后向引用

使用"\数字"代表前面某个子模式的匹配内容

?

??? 我们使用正则表达式,在很多场景下的作用是为了查找和替换,大部分语言的正则表达式实现中,在查找时,使用后向引用来代表一个子模式,语法是"\数字",而在替换中,语法是"$数字"。

??? 在正则表达式中,我们可以使用 "\数字" 来进行后向引用,数字表示这里引用的是前面的第几个子模式。如下:

?

Text
<h1>This is a valid header</h1>
<h2>This is not valid.</h3>
RegEx
<h([1-6])>.*?</h\1>
Result
<h1>This is a valid header</h1>
<h2>This is not valid.</h3>

?

?

??? 上面示例中,\1代表前面的子模式([1-6])的匹配结果 1,所以不符合的匹配<h2>..</h3>并没有被匹配。

??? 后向应用常见的应用常见是:

匹配重复单词 (\w+) \1匹配合法的html标记,如上例。

?

非获取匹配

在子模式内部前面添加"?:"

?

??? 非获取匹配表示这个子模式的匹配内容不会被保存,不能用于后向引用中。简单说,非获取匹配就是 只匹配,不保存。看个例子:

?

Text
Windows 95 and Windows 98 are the successor.
Then Windows 2000 and Windows Xp appeared.
Windows Vista is the Latest version of the family.
RegEx
Windows (?:[\w]+\b)
Result
Windows 95 and Windows 98 are the successor.
Then Windows 2000 and Windows Xp appeared.
Windows Vista is the Latest version of the family.

?

??? 在这个例子中,子模式(?:[\w]+\b)是一个非获取匹配,只匹配内容,单并未保存字匹配的结果。

?

正向预查

在子模式的内部前面添加"?="

?

??? 正向预查的意思是,子模式仅仅作为条件限制,并不作为匹配结果输出,子模式前面的。

?

Text
Windows 95 and Windows 98 are the successor.
Then Windows 2000 and Windows Xp appeared.
Windows Vista is the Latest version of the family.
RegEx
Windows(?= [\d]+\b)
Result
Windows 95 and Windows 98 are the successor.
Then Windows 2000 and Windows Xp appeared.
Windows Vista is the Latest version of the family.

?

??? 这个例子中,要获取所有后面带有数字的Windows字符串。子模式在这里仅仅作为一个限制条件使用,仅参与匹配过程,并不作为匹配结果输出。

?

??? 负正向预查的作用正好与正向预查相反,语法为在子模式内部前面增加"?!"。

?

??? 比如上面例子,如果RegEx为Windows(?! [\d]+\b),则匹配的结果会是Windows Xp和Windows Vista中的windows。

?

反向预查

在子模式的内部前面添加"?<="

?

??? 反向预查与正向预查很相似,子模式仅仅作为条件限制,不作为结果输出,唯一的不同是,正向预查匹配子模式前面的结果作为匹配结果,而反向预查匹配子模式后面的结果作为匹配结果。看个例子:

?

Text
CNY:100.2
USD:222.1
USD:301.3
HKD:122.1
CNY:114.4
?RegEx
(?<=CNY:)\d+\.\d
Result
CNY:100.2
USD:222.1
USD:301.3
HKD:122.1
CNY:114.4

?

??? 这个例子里,要获取属于CNY的金额。子模式仅参与匹配过程,并不作为匹配结果输出。

?

?

??? 负反向预查的作用正好与反向预查相反,语法为在子模式内部前面增加"?<!"。

?

??? 比如上面例子,如果RegEx为(?<!CNY:)\b\d+\.\d,则会获取不属于CNY的金额.

热点排行