我正在尝试将John Gruber的An Improved Liberal, Accurate Regex Pattern for Matching URLs集成到我的一个Javascripts中,但是WebKit的检查员(在Google Chrome 5.0.375.125 for Mac中)给出了“无效组”正则表达式语法错误。
格鲁伯的原始正则表达如下:
(?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>');
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
Safari错误如下:
SyntaxError: Invalid regular expression: unrecognized character after (?
他声称它应该适用于现代JavaScript regexp解释器,我假设它是WebKit&amp; V8会。 JavaScript的regexp语法是否不支持(?:
(该死的谷歌没有索引标点符号!)分组语法?我是否只是想错过一些东西?
答案 0 :(得分:15)
Gah,这是正则表达式开头的模式修饰符(即(?i)
)!
我经历了Regular-Expressions.info's datails on "JavaScript's Regular Expression Flavor",特别是不支持的列表,还有“模式修饰符”,我在正则表达式的正斜杠结束后已经指定了。把它撕成一片似乎很好。
所以,我的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