7

John Gruberの改良されたリベラルで正確な正規表現パターンをJavaScriptの1つに統合しようとしていますが、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`!()\[\]{};:'".,<>?«»“”‘’]))

正規表現を使用した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正規表現インタープリターで機能するはずだと主張しています。これは、WebKitとV8で機能すると思います。JavaScriptの正規表現構文は(?:(句読点のインデックスを作成しないことでGoogleを酷評します!)グループ化構文をサポートしていませんか?何かを逃れるのを逃しただけですか?

4

1 に答える 1

15

ああ、それは正規表現の最初のモード修飾子(つまり)でした!(?i)

「JavaScriptの正規表現フレーバー」に関するRegular-Expressions.infoのデータ、特にサポートされていないもののリストを調べました。正規表現のスラッシュを閉じた後にすでに指定した「モード修飾子」がありました。それをすべて取り除いたのは良さそうです。

したがって、私の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 に答える