在JavaScript中尝试使用Gruber的"改进的"URL匹配regexp模式时,如何修复"无效组"错误?

mor*_*ant 7 javascript regex gruber

我正在尝试整合John Gruber的改进的自由,准确的正则表达式模式,以便将URL匹配到我的Javascripts中,但是WebKit的检查器(在Google Chrome 5.0.375.125 for Mac中)给出了"无效组"正则表达式语法错误.

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

我的JavaScript与regexp的行如下(带正斜杠反斜杠转义):

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>');
Run Code Online (Sandbox Code Playgroud)

Google Chrome(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
Run Code Online (Sandbox Code Playgroud)

Safari错误如下:

SyntaxError: Invalid regular expression: unrecognized character after (?
Run Code Online (Sandbox Code Playgroud)

他声称它应该适用于现代JavaScript regexp解释器,我假设它是WebKit和V8.JavaScript的regexp语法是否不支持(?:(该死的谷歌没有索引标点符号!)分组语法?我是否只是想错过一些东西?

mor*_*ant 15

Gah,它是正则表达式开头的模式修饰符(即(?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
Run Code Online (Sandbox Code Playgroud)