零宽断言

正则表达式 大家都很熟悉了,零宽断言 是正则表达式中比较高级的用法了。

断言

断言(assertion)通常情况下指的是在目标字符串的当前位置进行的一种判断测试,但这种测试不会占用目标字符串,这意味着不会移动目标字符串在当前匹配中的位置。

零宽断言

一般的正则表达式匹配,都是有 宽度 的,如:\w+。 会将 一同匹配到。

如果像 这样的内容只是一种判断条件,即不想被正则匹配到,就要使用到 零宽断言 了。

零宽正向预测先行

(positive lookahead) (?=exp) 断言 指定位置的后面 能够匹配表达式 exp。如 x(?=y),当 x 后面跟着 y 时,匹配该 x,但不将 y 作为匹配的一部分。

零宽负向预测先行

(negative lookahead) (?!exp) 断言 指定位置的后面 不满足表达式 exp。如 x(?!y),只有当 x 后面跟着的不是 y 时,才匹配该 x

零宽正向回顾后发

(positive lookbehind) (?<=exp) 断言 指定位置的前面 能够匹配表达式 exp。如 (?<=x)y,只有当 y 的前面是 x 时,才匹配该 y

零宽负向回顾后发

(negative lookbehind)(?<!exp) 断言 指定位置的前面 不满足表达式 exp ,如 (?<!x)y,只有当 y 的前面不是 x 时,才匹配该 y

JS 中对零宽断言的支持

正则表达式有多种引擎实现,根据正则引擎的语法和行为,可以分为多种 正则表达式流派regular expression flavor)。

不同的正则引擎之间并不完全兼容,比如:回顾后发断言(lookbehind)由于存在回溯情况,JavaScript 没有对其进行实现