1

我想要这个正则表达式:

.match(/wtflungcancer.com\/\S*(?<!js)/i)

根据存在 'js' 的事实,不匹配以下字符串。但是,以下内容与整个 URL 匹配:

"http://www.wtflungcancer.com/wp-content/plugins/contact-form-7/includes/js/jquery.form.min.js?ver=3.32.0-2013.04.03".match(/wtflungcancer.com\/\S*(?<!js)/i)
4

2 回答 2

2

发生这种情况是因为 \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'”。这是有效的,因为前瞻不消耗实际字符,它们只是逐个字符移动以查看匹配是否良好。

于 2013-06-23T21:36:18.477 回答
1

你可以试试这个模式:

wtflungcancer.com\/(?>[^\s.]++|\.++(?!js))*(?!\.)

说明:

目标是允许所有不是空格或点的字符后跟js

(?>                # open an atomic group
    [^\s.]++       # all characters but white characters and .
  |                # OR
    \.++(?!js)     # . not followed by js
)*                 # close the atomic group, repeat zero or more times

为了确保您的模式检查所有 url 字符串,我添加了一个前瞻来检查是否没有跟随一个点。

于 2013-06-23T21:22:49.347 回答