正则表达式断言
断言的组成之一是边界。对于文本、词或模式,边界可以用来表明它们的起始或终止部分(如先行断言,后行断言以及条件表达式)。
边界类断言
^
匹配输入的开头。比如 /^A/
匹配不了 "an A"
里面的 "A"
,但是可以匹配 "An A"
里面第一个 "A"
。
备注:^
出现在集合或范围开头时的含义与此不同(参见 group
)。
$
匹配输入的结束。比如 /t$/
不能匹配 "eater"
中的 "t"
,但是可以匹配 "eat"
中的 "t"
。
\b
匹配一个单词的边界,这是一个字的字符前后没有另一个字的字符位置,例如在字母和空格之间。需要注意的是匹配的单词边界不包括在匹配中。换句话说,匹配字边界的长度为零。
\b
位置取决于匹配左边界或右边界。
一些例子:
/\bm/
在"moon"
中匹配到"m"
/oo\b/
在"moon"
中不会匹配到"oo"
, 因为"oo"
后面跟着"n"
这个单词字符。/oon\b/
在"moon"
中匹配"oon"
,因为"oon"
是这个字符串的结尾,因此后面没有单词字符/\w\b\w/
将永远不会匹配任何东西,因为一个单词字符后面永远不会同时有一个非单词字符和一个单词字符。 匹配退格字符 ([\b]
), 查看字符类。
\B
匹配非单词边界。这是上一个字符和下一个字符属于同一类型的位置:要么两者都必须是单词,要么两者都必须是非单词,例如在两个字母之间或两个空格之间。字符串的开头和结尾被视为非单词。与匹配的词边界相同,匹配的非词边界也不包含在匹配中。例如,/\Bon/
在"at noon"
中匹配"on"
,/ye\B/
在 "possibly yesterday"
中匹配"ye"
。
其他断言
备注: ?字符也可用作量词
x(?=y)
先行断言: x 被 y 跟随时匹配 x。
例如,对于/Jack(?=Sprat)/
,"Jack"
在跟有"Sprat"
的情况下才会得到匹配./Jack(?=Sprat|Frost)/
"Jack"
后跟有"Sprat"
或"Frost"
的情况下才会得到匹配。不过, 匹配结果不包括"Sprat"
或"Frost"
。
x(?!y)
先行否定断言: x 没有被 y 紧随时匹配 x。
例如,对于/\d+(?!\.)/
,数字后没有跟随小数点的情况下才会得到匹配。对于/\d+(?!\.)/
匹配(3.141),结果为'141'
而不是'3'
。
(?<=y)x
后行断言: x 跟随 y 的情况下匹配 x。
例如,对于/(?<=Jack)Sprat/
,"Sprat"
紧随"Jack"
时才会得到匹配。对于/(?<=Jack|Tom)Sprat/
,"Sprat"
在紧随"Jack"
或"Tom"
的情况下才会得到匹配。不过,匹配结果中不包括"Jack"
或"Tom"
。
(?<!y)x
后行否定断言: x 不跟随 y 时匹配 x。
例如,对于/(?<!-)\d+/
,数字不紧随 -
符号的情况下才会得到匹配。对于/(?<!-)\d+/
匹配(3) ,结果为"3"
。 而/(?<!-)\d+/
匹配(-3),无结果,这是由于数字之前有 -
符号。