帮助制作一个“通用”正则expression式Javascript兼容

我在这个网站上find了一个非常漂亮的URL正则expression式匹配器: http : //daringfireball.net/2010/07/improved_regex_for_matching_urls 。 它指出,它是免费使用,它是跨语言兼容(包括Javascript)。 首先,我必须逃避一些斜线才能编译它。 当我这样做,它在rubular.com(我通常testing正则expression式),罚款的副作用,每场比赛有5个领域的罚款:1是url,额外的4是空的。 当我把这个在JS中,我得到错误“无效组”。 我使用Node.js,如果有什么区别,但我希望我能理解这个错误。 我想减less不必要的空场地,但我甚至不知道从哪里开始诊断这个野兽。 这是我逃跑后所得到的:

(?xi)\b((?:[az][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][az]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”''] )) 

其实,你也不需要第一个捕捉组; 在这种情况下,它与整个比赛是一样的,而且总是可以通过$&来访问。 您可以通过在打开的元素后添加?:来将所有捕获组更改为不捕获:

 /\b(?:(?:[az][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][az]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(\(?:[^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”'']))/i 

这个“无效组”错误是由于内嵌修饰符(即(?xi) ),因为@kirilloid观察到,在JavaScript中不支持。 Jon Gruber(正则expression式的作者)误解了这个,因为他是关于JS支持自由间距模式的。

只是供参考,你必须避免斜线的原因是因为你正在使用正则expression式,其中最常见的forms使用正斜杠作为正则expression式分隔符。 换句话说,就是语言 (Ruby或者JavaScript)需要你转义那个特定的字符,而不是正则expression式。 一些语言让你select不同的正则expression式分隔符,而另一些则根本不支持正则expression式文字。

但这些都是语言问题,而不是正则expression式问题; 正则expression式本身似乎像广告一样工作。

你看,你抄错了。

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

  • 没有模式修饰符可以在正则expression式中设置匹配选项。
  • 没有正则expression式的评论

即(?xi)在开始时是无用的。
x对于压缩的RegExp是毫无用处的
可以换成国旗
所有这些导致:

 /\b((?:[az][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][az]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”'']))/i 

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