我在这个网站上找到了一个非常好的URL正则表达式匹配器:http://daringfireball.net/2010/07/improved_regex_for_matching_urls。它声明它是免费使用的,并且是跨语言兼容的(包括Javascript)。首先,我必须转义一些斜杠才能让它编译。当我这样做时,它在Rubular.com (我通常测试正则表达式)上工作得很好,奇怪的副作用是每个匹配都有5个字段:1是url,额外的4是空的。当我把它放到JS中时,我得到了错误"Invalid Group“。如果有什么不同的话,我正在使用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`!()\[\]{};:'".,<>?«»“”‘’] ))发布于 2011-02-08 11:05:03
实际上,您也不需要第一个捕获组;在本例中,它与整个匹配相同,并且始终可以通过$&访问。您可以通过在开始括号后添加?:,将所有采集分组更改为非采集分组:
/\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文字。
但这些都是语言问题,而不是正则表达式问题;正则表达式本身似乎像广告中所说的那样工作。
发布于 2011-02-08 08:53:51
请注意,你抄袭错了。
http://www.regular-expressions.info/javascript.html
也就是说,开头的(?xi)是没用的。
对于压缩的RegExp,x根本无用。
i可以替换为标志
所有这些都会导致:
/\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中工作
https://stackoverflow.com/questions/4928345
复制相似问题