正则表达式断⾔、巡视(Assertions)、正向断⾔、反向
断⾔介绍
断⾔(Assertions)在正则表达式概念⾥⾯难理解,它通常指的是在⽬标字符串的当前匹配位置进⾏的⼀种测试但这种测试并不占⽤⽬标字符串,也即不会移动模式在⽬标字符串中的当前匹配位置。详细可以看看,,⾥⾯提到“零宽度“很多元字符,只是对特殊位置进⾏匹配,它们可以理解为断⾔。
断⾔元字符
常见断⾔元字符有: \b, \B, \A, \Z, \z, ^ ,$ 它们只是表⽰特殊位置,各⾃作⽤如有字符串AB,带位置表⽰为:0A1B2
元字符意义(以上⾯带位置字符串说明)
^⾏⾸,字符串⾸表⽰位置0
$⾏尾,字符串尾部,表⽰位置2
\b字分界线,可以表⽰:0,2位置
\B⾮字分界线,可以表⽰1位置
\A⽬标的开头(独⽴于多⾏模式)表⽰位置0
\Z⽬标的结尾或位于结尾的换⾏符前(独⽴于多⾏模式)表⽰位置2
\z⽬标的结尾(独⽴于多⾏模式)表⽰位置2
\G⽬标中的第⼀个匹配位置
A,Z,z,G很少使⽤
这些断⾔的测试都是⼀些基于当前位置的测试,断⾔还⽀持更多复杂的测试条件。更复杂的断⾔以⼦模式⽅式来表⽰,它包括先⾏(前向)断⾔(Lookahead assertions)和后⾏(后向)断⾔(Lookbehind assertions),这些断⾔判断只做匹配判断条件,不会记录在匹配结果中,不会匹配字符。
先⾏断⾔、正向断⾔、正向巡视(Lookahead assertions)
先⾏断⾔,常有表⽰(?=pattern),从当前匹配位置开始测试后⾯匹配字符串是否成⽴,还有(?!pattern)这样两种格式,我们来看看⼀个例⼦。源字符串:“abc100”,正则表达式是:
/
[a-z]+(?=\d+)/ ,我们分析下过程如下图:
正则化残差⾸先由正则表达式字符 [a-z]+ 取得控制权,匹配字符:”abc”,位置从”0”开始匹配,变成3。从该位置测试/d+是否成⽴。匹配到字符100,返回成⽴。因此正则表达式正向断⾔成功。返回匹配字符串”abc”
(?!pattern) 只是,正向匹配,当后⾯没有匹配成功,将返回真。以下是系统源字符串:abc100,测试结果如下:
后⾏断⾔、反向断⾔、反向巡视(Lookbehind assertions)
后⾏断⾔,常见表达式是:(?<=pattern)或者(?<!pattern)格式。正则表达式⾥⾯,不要出现不固定长度量词,可能会出现死循环。匹配出错。表⽰当前位置左边将出现匹配字符,则返回真,后⾯匹配正常。因为如果它出现在最左边,默认位置从0开始,匹配都是失败的。⼀般都从后⾯正则表达式开始匹配,再回溯,直到匹配到为⽌。我们看看下⾯例⼦:源字符
串:“abc100+=“,正则表达式是:”(?<=\w)\w+”,匹配过程如下图:
⾸先由正则表达式字符 /\w+/取得控制权,匹配字符:”abc100”,位置从”0”开始匹配,匹配到6个字符。从该位置0检测左变\w匹配失败。因此/\w+/从字符b开始匹配到”bc100”,测试它左侧有字符”a”,反向断⾔正确。因此匹配到字符串“bc100”,(?
<!pattern),只是没有匹配成功返回真,其它都⼀样!
后记:从这篇⽂章,我们发现搜索特点都是从左到有,⼀般正向断⾔放到,正则表达式后,反向断⾔放到匹配正则表达式前。但是,这⾥也可以放到前或后。这⾥就不再举例。欢迎交流讨论!

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