1

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

(?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`!()\[\]{};:'".,<>?«»“”‘’] ))
4

2 回答 2

3

实际上,您也不需要第一个捕获组;在这种情况下,它与整个匹配相同,并且始终可以通过$&. ?:您可以通过在左括号后添加将所有捕获组更改为非捕获:

/\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(正则表达式的作者)对此有误,因为他认为 JS 支持自由间距模式。

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

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

于 2011-02-08T03:05:03.353 回答
2

看来,你复制错了。

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

  • 没有模式修饰符来设置正则表达式中的匹配选项。
  • 没有正则表达式注释

即 (?xi) 开头是没用的。
x对于压缩的 RegExp 完全没用
i可以用 flag 替换
所有这些结果:

/\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

在 Google Chrome 中测试和工作 => 应该在 Node.js 中工作

于 2011-02-08T00:53:51.320 回答