JavaScriptの最短URL正規表現一致


16

JavaScriptで実行したときにテキスト内のURLにほぼ一致する最短の正規表現を作成します

例:

"some text exampley.com".match(/your regular expression goes here/);

正規表現は

  • httpおよびhttps用の有効なURLをすべてキャプチャします。
  • 実際に有効なURLではないURLのような文字列に一致しないことを心配しないでください super.awesome/cool
  • JavaScript正規表現として実行するときに有効である

テスト基準:

一致:

合わない:

  • 超クール
  • おはようございます
  • できます
  • こんにちは。

http://jsfiddle.net/MikeGrace/gsJyr/を少し明確にするのに役立つテストを次に示します。

明快さの欠如をおizeびします。一致するURLがどれほどひどいものであるかを理解していませんでした。


ああ!編集権限がありません!ゲームを1つの言語に制限する場合は、おそらくその言語でタグ付けする必要があります。
dmckee

有効なURL文字とは何ですか?単純\wにすべてに使用できるため、さまざまなURLコンポーネントの後方参照を期待していますか?
明唐

1
RFC 2396によれば、「URIは非常に限られたセットの文字のシーケンス、つまり基本的なラテン系アルファベットの文字、数字、およびいくつかの特殊文字です」。
ランナーリック

マイク:まだいくつか明確なことがあると思います。現在のところ/:/、正規表現として使用し、有効なURIと一致するだけで、「一致しない」リストにあるすべての例と一致するわけではありません。あなたがそのルートを進んでいる限り、それは単に質問です:サンプル文字列のいずれにも一致しないが、それでもすべてのURIをキャッチする最も短い正規表現は何ですか。
ジョーイ

1
より詳細な長い課題を書くようにしてください。

回答:


1
/.+\.\w\w.*/

すべきではない3つの文字列とは一致せず、他のほとんどの文字列と一致します;)
upd:それでも5つすべてとは一致しません


14

これは動作します:

var re = /(^|\s)((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/gi;

/*
(^|\s)                            : ensure that we are not matching an url 
                                    embeded in an other string
(https?:\/\/)?                    : the http or https schemes (optional)
[\w-]+(\.[\w-]+)+\.?              : domain name with at least two components;
                                    allows a trailing dot
(:\d+)?                           : the port (optional)
(\/\S*)?                          : the path (optional)
*/

http://jsfiddle.net/9BYdp/1/でテストに合格します

次にも一致:

  • example.com。(末尾のドット)
  • example.com:8080(ポート)

甘味!!!!!!!
マイクグレース

2
ホスト名を1つのコンポーネント(たとえばlocalhost)だけと一致させたくありませんか?
ランナーリック

これによりスペースが許可されます
-brenjt

私のために働く。ty :)
スチール

うまく動作しますが、ユーザー/パスワードの部分があるドメインではそうではありません。たとえばhttp://user:password@domain.com/path
Radon8472

5

これは明らかにあなたが意図したことを行いませんが、それはあなたの基準を満たしています:

 /.*/
  • 「httpおよびhttps用の有効なURLにすべて一致します。」

    はい、間違いなく一致します。

  • 「 'super.awesome / cool'のような実際に有効なURLではないURLのような文字列に一致しないことを心配しないでください」

    ええ、確かに、多くの誤検知がありますが、あなたはそれは重要ではないと言いました。

  • JavaScript正規表現として実行するときに有効である

    卵があなたの言う通りに機能することを確認してください。

この結果が正解でない場合は、基準をより選択的にする必要があります。

意図したとおりに機能するルールにするために、実際に完全なRFC準拠のマッチャーを実装する必要があり、完全なRFC準拠のマッチャーは「一致しないことを心配します」。

したがって、「一致しないことを許可する」という観点からは、RFCからの逸脱が許容されるものを正確に指定する必要があります。

それ以外は何でも、この演習全体は偽です。なぜなら、人々は自分に合ったものや好きなものを書くだけで、「私がやったように」短いことを「意味を作る」ことを犠牲にするからです。

アップデートについて

これまでに貼り付けたすべての例と一致する(キャプチャする)最も簡単な正規表現は次のとおりです。

/(\S+\.[^/\s]+(\/\S+|\/|))/g;

その性質は非常に単純であり、3つの基本的な形式のみが可能であると想定しています。

x.y
x.y/
x.y/z 

z空白ではないものにすることができます。 x空白以外のものを指定できます。 y空白でも「/」文字でもない任意のものを指定できます。

このルールに有効なものはたくさんありますが、少なくとも人間にとって有効なURIのように見えますが、仕様の互換性はありません。

例えば:

hello.0/1  # valid 
1.2/1 # valid 
muffins://¥.µ/€  # probably valid

健全なアプローチは、URIである可能性が高いものを抽出し、より厳密なもので検証することだと思います。ブラウザのURIクラスを使用して検証する方法を探しています=)。

ただし、このサンプルで動作している上記の推論は、http//jsfiddle.net/mHbXx/で確認できます。


彼は質問を変更しましたが/:/、編集後でもとにかく良くすることができます:
ジョーイ

マイク=に感謝します。私はもっ​​と真剣に競争したくはありません、他の提案はもっと便利です。質問の質が向上するように初期の前提で問題を指摘したかっただけです=)
ケントフレドリック

それは私だけですか、これは「www .google .com」に一致していますか?
スキアヴィーニ

1
/https?\:\/\/\w+((\:\d+)?\/\S*)?/

やってみて

正規表現を区切る先頭と末尾のスラッシュが含まれているので、うまくいけば文字数が減ることはありません!

このパターンは、プロトコルをhttpまたはhttpsに制限し、オプションのポート番号を許可してから、空白以外の文字を許可します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.