在javascript中使用正则表达式,假设我想匹配foo
。但我只想在bar
之前或之后没有立即出现时才匹配它。
火柴foo
foo
foo bar
bar foo
string foo
stringfoo
foo. string
不匹配foo
barfoo
foobar
您可以使用负后视和负前瞻:
(?<!bar)foo(?!bar)
- 负面的回溯遵循语法
(?<!x)y
。如果此表达式前面没有立即带有x
y
,则该表达式将匹配。 - 负前瞻遵循语法
y(?!x)
。如果此表达式后面不紧跟x
,则此表达式将匹配y
。
正如其他人所说,在大多数语言中执行此操作的最简单的正则表达式是使用负面的后视和消极的前瞻:
(?<!bar)foo(?!bar)
演示
但是,Javascript 不支持正则表达式中的后视。 相反,您可以通过第二次向前看来模仿后瞻的行为:
(?:(?!bar).{3}|^.{0,2})(foo)(?!bar)
演示
我已将foo
放在捕获组中,以防您实际上想在实际代码中使用此匹配的值;如果您只关心正则表达式是否匹配,而不是正则表达式匹配的内容,那么您可以将(foo)
替换为仅foo
(没有括号(。
诀窍在正则表达式的这一部分:(?!bar).{3}|^.{0,2}
.这是说"要么 3 个字符不bar
,要么少于 3 个字符"——这将有效地达到与后视相同的结果。