正则表达式前瞻(?=)、后顾(?<)、负前缀(?!)、负后顾(?<!)
正则表达式前瞻(?=)、后顾(?<)、负前缀(?!)、负后顾(?<!)
正则表达式前瞻、后顾这几个概念好像比较少会碰到,但是对于解决一些特定的匹配问题有非常重要的作用。
这几个概念的英文是 Lookahead and Lookbehind Zero-Length Assertions ,完整的中文名应该是前瞻后顾零宽断言。它匹配一些字符,但是并不包含匹配模式,只是确定是否匹配,也就是所谓的零宽。
前瞻 Lookahead 使用 ?=
,q(?=u)
,表示 u 前面是 q ,也就是 q 后面跟 u , 但匹配结果中不包含 u (零宽)。
同理,后顾 Lookbehind 使用 ?<
,(?<q)u
表示 q 后面是 u,也就是 u 前面为 q , 但匹配结果不包含 q (零宽)。
而这两个方式的相反匹配,负前瞻 q(?!u)
和负后顾 (?<!q)u
,分别表示 不为 u 的前面是 q
和 不为 q 的后面是 u
。
下面是一下例子:
abc(?=123) abc123 匹配,abc
123abc 不匹配
abc(?!123) abc123 不匹配
abc456 匹配,abc
def123 不匹配
(?<abc)123 abc123 匹配,123
def123 不匹配
(?<!abc)123 abc123 不匹配
def123 匹配,123
kkk123 匹配,123
在涉及到正则表达式非
的概念时,通常使用到前瞻后顾很好解决。