正则表达式--获取匹配和⾮获取匹配
在使⽤正则表达式的时候,我们经常会使⽤()把某个部分括起来,称为⼀个⼦模式。
⼦模式有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标记,如上例。
⾮获取匹配
在⼦模式内部前⾯添加"?:"
⾮获取匹配表⽰这个⼦模式的匹配内容不会被保存,不能⽤于后向引⽤中。简单说,⾮获取匹配就是 只匹配,不保存。看个例⼦:
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。
反向预查
在⼦模式的内部前⾯添加"?<="
反向预查与正向预查很相似,⼦模式仅仅作为条件限制,不作为结果输出,唯⼀的不同是,正向预查匹配⼦模式前⾯的结果作为匹配结果,⽽反向预查匹配⼦模式后⾯的结果作为匹配结果。看个例⼦:
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的⾦额.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。