2011-02-08 10 views
1

私はこのサイトで非常に素晴らしいURL正規表現matcherを見つけました:http://daringfireball.net/2010/07/improved_regex_for_matching_urls。それは自由に使用することができ、クロス・ランゲージ互換(Javascriptを含む)であることが記載されています。まず、スラッシュの一部をエスケープしてコンパイルする必要があります。私はそれを行うときRuby.com(一般的には正規表現をテストする)でうまくいきます。奇妙な副作用で5つのフィールドがあります.1つはurl、4つは空です。これをJSに入れると、「無効なグループ」というエラーが表示されます。違いがあればNode.jsを使っていますが、そのエラーを理解できたらいいと思います。私は不必要な空のマッチフィールドを元に戻したいが、私はこの獣の診断をどこで始めるべきか分からない。これは私がエスケープした後に持っていたものです。"ユニバーサル"正規表現Javascriptの互換性を助ける

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

答えて

3

実際には、の最初のキャプチャグループは不要です。この場合の試合全体と同じで、常に$&でアクセスできます。あなたは開口部が括弧の後?:を追加することにより、非キャプチャへのすべてのキャプチャグループを変更することができます。

/\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 

「無効なグループ」エラーが@kirilloidとして観察、インライン修飾(すなわち、(?xi))によるものであること、 JavaScriptではサポートされていません。 Jon Gruber(正規表現の著者)は、JSについてフリースペースモードをサポートしていたので、間違いました。

スラッシュをエスケープしなければならなかった理由は、正規表現の区切り記号として前方スラッシュを使用する最も一般的な形式の正規表現リテラル表記を使用していたためです。つまり、の言語(RubyまたはJavaScript)で、正規表現ではなくその特定の文字をエスケープする必要があります。いくつかの言語では異なる正規表現区切り文字を選択できますが、他の言語では正規表現リテラルはまったくサポートしていません。

しかし、これはすべての言語の問題であり、正規表現の問題ではありません。正規表現自体は広告されたように動作するようです。

2

Seemes、間違ってコピーしました。

http://www.regular-expressions.info/javascript.html

  • 正規表現の中に一致するオプションを設定するには、noモード修飾子。
  • 正規表現のコメントがありません

Ie. (?xi)は最初は役に立たない。
Xは全く圧縮さregexpに無用である

これらのすべての結果のフラグに置き換えることができます:

/\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 

をテストし、Google Chromeで作業するのNode.jsで>動作するはずです=

関連する問題