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

标签 javascript regex

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

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\.(.*)$

Working demo.

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

关于javascript - 正则表达式中的 (?!) 运算符如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18250070/

相关文章:

javascript - 通过 postman 发送一组数据到 Node

JavaScript 时钟只倒计时小时、分钟和秒……而不是天数

javascript - 根据滚动位置淡入淡出图像

regex - 从 []byte 中去除 C 风格的注释

java - 在特定索引的文本中嵌入单词

javascript - webpack: "[ERR_REQUIRE_ESM]: Must use import to load ES Module"- 但我正在使用导入!

javascript - 防止空字符串成为数组的一部分

java - 如何使用java正则表达式匹配两个字符串

javascript - 评论超出范围的正则表达式

javascript - Html 页面标记使用正则表达式计数