首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的正则表达式回看不能在使用Ruby1.9的URL上工作?

问为什么我的正则表达式回看不能在使用Ruby1.9的URL上工作?
EN

Stack Overflow用户
提问于 2013-06-24 05:14:04
回答 2查看 73关注 0票数 1

我想要这个正则表达式:

代码语言:javascript
复制
.match(/wtflungcancer.com\/\S*(?<!js)/i)

基于存在'js‘这一事实,不匹配以下字符串。但是,以下内容与整个URL匹配:

代码语言:javascript
复制
"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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-24 05:36:18

这是因为\S*吃掉了所有字符,所以后视永远不会被激活。

像这样的东西应该是有效的:

代码语言:javascript
复制
/wtflungcancer.com(?!\S*\.js)/i

基本上

对于包含wtflungcancer.com而不是后跟包含".js"的字符串,请使用lookahead

  • search
  • ,而不要让*消耗所有使用lookbehind的字符串

-- EDIT:添加更多解释--

与有什么不同

代码语言:javascript
复制
"wtflungcancer.com\S*(?<!\.js)"

和

代码语言:javascript
复制
"wtflungcancer.com(?!\S*\.js)"

它们看起来真的很像!

正则表达式中的Lookaround(前视和后视)告诉regexp引擎匹配是否正确:它们不使用字符串中的字符。

特别是lookbehinds告诉regexp引擎向后看,在您的例子中,look并没有固定在右边,所以"\S*“只是消耗了字符串中的所有非空格字符。

例如,下面的正则表达式可以查找不以“.js”结尾的url:

代码语言:javascript
复制
wtflungcancer.com\S+(?<!\.js)$

看见?后视的右侧使用字符串元字符结尾。

在我们的例子中,虽然我们不能将任何东西挂到右边,所以我从lookahead切换到了lookahead

因此,真正的正则表达式只匹配"wtflungcancer.com":在这一点上,前视告诉正则表达式引擎:“为了使这个匹配正确,这个字符串后面不能跟一个非空格字符序列,后面跟着'.js'”。这之所以有效,是因为lookahead并不使用实际的字符,它们只是逐个字符地移动,看看匹配是否正确。

票数 2
EN

Stack Overflow用户

发布于 2013-06-24 05:22:49

您可以尝试使用此模式:

代码语言:javascript
复制
wtflungcancer.com\/(?>[^\s.]++|\.++(?!js))*(?!\.)

解释:

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

代码语言:javascript
复制
(?>                # 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字符串,我添加了一个先行检查,以检查是否有一个点没有跟随。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17265399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档