7

我正在尝试将 John Gruber 的用于匹配 URL 的改进的自由、准确的正则表达式模式集成到我的一个 Javascript 中,但是 WebKit 的检查器(在 Mac 的 Google Chrome 5.0.375.125 中)给出了“无效组”正则表达式语法错误。

Gruber 的原始正则表达式如下:

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

我的带有正则表达式的 JavaScript 中的行如下(带有正斜杠反斜杠转义):

tweet_text = tweet_text.replace(/(?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`!()\[\]{};:'".,<>?«»“”‘’]))/gi, '<a href="$1">$1</a>');

而谷歌浏览器(V8?)错误如下:

Uncaught SyntaxError: Invalid regular expression: /(?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`!()\[\]{};:'".,<>?«»“”‘’]))/: Invalid group

Safari错误如下:

SyntaxError: Invalid regular expression: unrecognized character after (?

他声称它应该在现代 JavaScript 正则表达式解释器中工作,我认为 WebKit 和 V8 可以。JavaScript 的正则表达式语法不支持(?:(该死的谷歌没有索引标点符号!)分组语法吗?我只是错过了逃避什么吗?

4

1 回答 1

15

啊,它是正则表达式开头的模式修饰符(即)!(?i)

我浏览了Regular-Expressions.info 关于“JavaScript 的正则表达式风格”的数据,特别是支持的列表,还有“模式修饰符”,我已经在正则表达式的正斜杠之后指定了它。把它撕下来,一切看起来都很好。

所以,我的 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`!()\[\]{};:'".,<>?«»“”‘’]))/gi
于 2010-08-24T21:43:37.067 回答