前瞻断言(lookahead assertion)允许在给定位置上匹配指定模式,而不会改变当前光标位置。
表达式
(?=pattern)
: 肯定前瞻断言。(?!pattern)
:否定前瞻断言。
*前瞻* 二字来源于 lookahead 字符。在编译原理中,lookahead 指向的是当前光标后的字符,这与阅读顺序中的“前”正好相反。
使用
匹配以 $ 结尾的数字
\d+(?=\$)
在上面的例子中,在匹配时首先匹配所有的数字,然后 lookahead 前面的字符是否以 $
结尾。
匹配以 body 结尾的字符串
(?=.*body).*
在上面的例子中,首先 lookahead 检查给定字符串是否匹配 .*body
,注意这时候光标位置并没有改变,依然位于字符串开头,然后再将字符串提取出来。