发生这种情况是因为 \S* 吃掉了所有字符,因此永远不会激活后视。
像这样的东西应该工作:
/wtflungcancer.com(?!\S*\.js)/i
基本上
- 不要让 * 消耗所有字符
- 而不是使用前瞻,而是使用前瞻
- 搜索包含 wtflungcancer.com 的字符串后面不是包含“.js”的字符串
-- 编辑:添加了更多解释 --
和有什么区别
"wtflungcancer.com\S*(?<!\.js)"
和
"wtflungcancer.com(?!\S*\.js)"
他们看起来真的很相似!
正则表达式中的环视(lookahead 和lookbehind)告诉正则表达式引擎何时匹配正确:它们不消耗字符串的字符。
特别是lookbehinds告诉正则表达式引擎向后看,在您的情况下,lookbehind没有锚定在右侧,所以“\ S *”只是消耗了字符串中的所有非空白字符。
例如,此正则表达式可用于查找不以“.js”结尾的 url:
wtflungcancer.com\S+(?<!\.js)$
看?后视的右侧使用字符串元字符的结尾进行锚定。
在我们的例子中,虽然我们无法将任何东西挂在右侧,所以我从后视切换到前瞻
因此,真正的正则表达式只匹配“wtflungcancer.com”:在这一点上,前瞻告诉正则表达式引擎:“为了使这个匹配正确,这个字符串后面不能跟一系列非空白字符通过'.js'”。这是有效的,因为前瞻不消耗实际字符,它们只是逐个字符移动以查看匹配是否良好。