1

このサイトで非常に優れたURL正規表現マッチャーを見つけました:http://daringfireball.net/2010/07/improved_regex_for_matching_urls。自由に使用でき、言語間で互換性がある(Javascriptを含む)と記載されています。まず、コンパイルするにはスラッシュをいくつかエスケープする必要があります。これを行うと、Rubular.com(通常は正規表現をテストします)で正常に機能しますが、各一致に5つのフィールドがあるという奇妙な副作用があります。1つはURLで、余分な4つは空です。これをJSに入れると、「InvalidGroup」というエラーが表示されます。違いがあればNode.jsを使用していますが、そのエラーを理解できればと思います。不要な空の一致フィールドを減らしたいのですが、この獣の診断をどこから始めればよいのかさえわかりません。これは私が逃げた後に持っていたものです:

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

2 に答える 2

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

(?xi)この「無効なグループ」エラーは、@ kirilloidが観察したように、JavaScriptでサポートされていないインライン修飾子(つまり、)が原因です。Jon Gruber(正規表現の作成者)は、JSがフリースペースモードをサポートしていることについて、それについて誤解していました。

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

しかし、これらはすべて言語の問題であり、正規表現の問題ではありません。正規表現自体は、宣伝どおりに機能しているように見えます。

于 2011-02-08T03:05:03.353 に答える
2

間違ってコピーしたようです。

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

  • 正規表現内で一致するオプションを設定するためのモード修飾子はありません。
  • 正規表現のコメントはありません

つまり、最初の(?xi)は役に立ちません。
xは、圧縮された正規表現にはまったく役に立ちません
。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`!()\[\]{};:'".,<>?«»“”‘’]))/i

GoogleChromeでテストおよび動作=>Node.jsで動作するはずです

于 2011-02-08T00:53:51.320 に答える