正则表达式中的(?!)运算符如何工作?

kib*_*bin 6 javascript regex

我以为我理解正则表达式运算符是如何工作的,但现在我真的很困惑.在简化示例中,我有两个字符串:

mail.wow.no-1.com
mail.ololo.wow.com
Run Code Online (Sandbox Code Playgroud)

我想匹配第一个,而不是第二个.我正在写这样的正则表达式(简化版):

^mail\.(.*)(?!\.wow\.com)$
Run Code Online (Sandbox Code Playgroud)

当我在这两个例子中运行JS方法测试时,它只返回true(在崇高的2正则表达式搜索中突出显示两个字符串,这意味着两个字符串匹配)

我知道我可以制作反向正则表达式,它将匹配第二个并根据这个制作逻辑,但我只想了解(?!)正则表达式如何工作以及我做错了什么.

谢谢.

Mar*_*der 8

你需要.*在前瞻内部(并.*在前瞻的外部前移动):

^mail(?!.*\.wow\.com)\.(.*)$
Run Code Online (Sandbox Code Playgroud)

否则,您的前瞻只会检查字符串的末尾.显然,在字符串的末尾,永远不会有.wow.com.您现在也可以将前瞻移动到模式的开头:

^(?!.*\.wow\.com)mail\.(.*)$
Run Code Online (Sandbox Code Playgroud)

工作演示.

最后一个变体的效率稍差,但如果影响整个字符串的前瞻一切都在模式的开头,我发现模式更容易阅读.