我想要这个正则表达式:
.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)发布于 2013-06-24 05:36:18
这是因为\S*吃掉了所有字符,所以后视永远不会被激活。
像这样的东西应该是有效的:
/wtflungcancer.com(?!\S*\.js)/i基本上
对于包含wtflungcancer.com而不是后跟包含".js"的字符串,请使用lookahead
-- EDIT:添加更多解释--
与有什么不同
"wtflungcancer.com\S*(?<!\.js)"和
"wtflungcancer.com(?!\S*\.js)"它们看起来真的很像!
正则表达式中的Lookaround(前视和后视)告诉regexp引擎匹配是否正确:它们不使用字符串中的字符。
特别是lookbehinds告诉regexp引擎向后看,在您的例子中,look并没有固定在右边,所以"\S*“只是消耗了字符串中的所有非空格字符。
例如,下面的正则表达式可以查找不以“.js”结尾的url:
wtflungcancer.com\S+(?<!\.js)$看见?后视的右侧使用字符串元字符结尾。
在我们的例子中,虽然我们不能将任何东西挂到右边,所以我从lookahead切换到了lookahead
因此,真正的正则表达式只匹配"wtflungcancer.com":在这一点上,前视告诉正则表达式引擎:“为了使这个匹配正确,这个字符串后面不能跟一个非空格字符序列,后面跟着'.js'”。这之所以有效,是因为lookahead并不使用实际的字符,它们只是逐个字符地移动,看看匹配是否正确。
发布于 2013-06-24 05:22:49
您可以尝试使用此模式:
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字符串,我添加了一个先行检查,以检查是否有一个点没有跟随。
https://stackoverflow.com/questions/17265399
复制相似问题