首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >帮助使“通用的”regex Javascript兼容

问帮助使“通用的”regex Javascript兼容
EN

Stack Overflow用户
提问于 2011-02-08 08:30:23
回答 2查看 1.1K关注 0票数 1

我在这个网站上找到了一个非常好的URL正则表达式匹配器:http://daringfireball.net/2010/07/improved_regex_for_matching_urls。它声明它是免费使用的,并且是跨语言兼容的(包括Javascript)。首先,我必须转义一些斜杠才能让它编译。当我这样做时,它在Rubular.com (我通常测试正则表达式)上工作得很好,奇怪的副作用是每个匹配都有5个字段:1是url,额外的4是空的。当我把它放到JS中时,我得到了错误"Invalid Group“。如果有什么不同的话,我正在使用Node.js,但我希望我能理解这个错误。我想减少不必要的空匹配字段,但我甚至不知道从哪里开始诊断这个野兽。这是我在逃脱后得到的:

代码语言:javascript
复制
(?xi)\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’] ))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-08 11:05:03

实际上,您也不需要第一个捕获组;在本例中,它与整个匹配相同,并且始终可以通过$&访问。您可以通过在开始括号后添加?:,将所有采集分组更改为非采集分组:

代码语言:javascript
复制
/\b(?:(?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(\(?:[^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/i

“无效的组”错误是由于内联修饰符(即,(?xi))造成的,正如@kirilloid所观察到的,在JavaScript中不受支持。Jon Gruber (regex的作者)对此误解了,因为他认为JS支持自由空格模式。

仅供参考,您必须转义斜杠的原因是因为您使用的是正则表达式文字表示法,其中最常见的形式是使用正斜杠作为正则表达式分隔符。换句话说,是语言(Ruby或JavaScript)要求您转义特定的字符,而不是正则表达式。有些语言允许您选择不同的regex分隔符,而其他语言则根本不支持regex文字。

但这些都是语言问题,而不是正则表达式问题;正则表达式本身似乎像广告中所说的那样工作。

票数 3
EN

Stack Overflow用户

发布于 2011-02-08 08:53:51

请注意,你抄袭错了。

http://www.regular-expressions.info/javascript.html

  • 无模式修饰符设置正则表达式内的匹配选项。
  • 无正则表达式注释

也就是说,开头的(?xi)是没用的。

对于压缩的RegExp,x根本无用。

i可以替换为标志

所有这些都会导致:

代码语言:javascript
复制
/\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/i

在谷歌Chrome =>中测试和工作应该可以在Node.js中工作

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

https://stackoverflow.com/questions/4928345

复制
相关文章

相似问题

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