我以为我了解正则表达式运算符的工作原理,但现在我真的很困惑。 在简化示例中,我有两个字符串:
mail.wow.no-1.com
mail.ololo.wow.com
我想匹配第一个,而不是第二个。 我正在这样写正则表达式(简化版):
^mail\.(.*)(?!\.wow\.com)$
当我在 JS 方法测试中运行这两个示例时,它只返回 true(在 sublime 2 regex 搜索中突出显示两个字符串,这意味着两个字符串都匹配)
我知道我可以制作反向正则表达式,它将匹配第二个并根据此制作逻辑,但我只想了解正则表达式中的 (?!)
是如何工作的以及我做错了什么.
谢谢。
最佳答案
你需要一个 .*
在前瞻中(并将它移动到 .*
前的前瞻之外):
^mail(?!.*\.wow\.com)\.(.*)$
否则,您的前瞻性检查只会在字符串的末尾进行。显然,在字符串的末尾,永远不会有 .wow.com
。您现在也可以将前瞻移动到模式的开头:
^(?!.*\.wow\.com)mail\.(.*)$
最后一个变体的效率稍低,但我发现如果影响整个字符串的前瞻都在模式的开头,模式更容易阅读。
关于javascript - 正则表达式中的 (?!) 运算符如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18250070/