URL 正規表現
短いパターンでテキストからWebアドレスを見つけ、コードに入れる前に、どこでマッチが止まるかを正確に確認できます。
URL 正規表現
ログやチャットのエクスポート、スクレイピングしたテキストからリンクを取り出すのは正規表現の仕事で、パターンは読める程度に短いのが理想です。このページは、パターン集のURL(http/https)のパターンhttps?:\/\/[^\s/$.?#][^\s]*を、フラグgi付きで入れた状態で正規表現テスターを開きます。
パターンの読み方
| 部分 | 意味 |
|---|---|
https? | http。sは省略可能 |
:\/\/ | コロンと2つのスラッシュ。コード内でスラッシュに挟んでも動くようにエスケープしている |
[^\s/$.?#] | ホスト名の先頭になれない文字以外の1文字。空白、スラッシュ、ドル記号、ドット、疑問符、ハッシュは不可 |
[^\s]* | 次の空白までの残りすべて |
gi | すべてのリンクを、大文字小文字を問わず探す |
拾うものと見逃すもの
| テキスト | 結果 |
|---|---|
https://logicutil.com/tool/regex-tester | アドレス全体 |
http://example.org/page?q=1#top | クエリとフラグメントを含むアドレス全体 |
http://localhost:8080/x | ポートを含むアドレス全体 |
HTTPS://EXAMPLE.COM/X | iフラグがあるのでマッチする |
https://例子.测试/路径 | マッチする。非ラテン文字のドメインやパスも保たれる |
Visit https://example.com. | https://example.com.(ピリオド付き) |
(https://example.com/a) | https://example.com/a)(閉じ括弧付き) |
www.example.com | マッチしない。スキームがない |
ftp://files.example.com | マッチしない。対象はhttpとhttpsだけ |
より厳密なパターン
末尾の句読点を含めないようにするには、マッチの終わりを先読みで指定します:https?:\/\/[^\s/$.?#][^\s]*?(?=[\].,;:!?)]*(?:\s|$))。このパターンは、後ろに句読点だけが続き、その次に空白かテキストの終わりが来る最短の部分を取ります。そのためVisit https://example.com.からはhttps://example.comが、(https://example.com/a)からはhttps://example.com/aが得られます。代償として、一部のWikipediaのアドレスのように本当に括弧で終わるリンクは、その括弧を失います。
リンクを見つけることは検証ではない
このようなパターンが答えるのは「このテキストにリンクらしきものが含まれているか」であって、「これは有効なアドレスか」ではありません。JavaScriptで1つの値を調べるなら、new URL(value)のほうが厳密です。ホストがまったくないhttps://に対しては例外を投げます。テキストから候補を見つけるのは正規表現に任せ、判断はnew URL()かサーバーに委ねてください。
関連ページ
見つけたリンクは、正規表現による検索と置換のページで[$&]($&)を使ってMarkdownに変えられます。フラグの挙動はJavaScript 正規表現テスターで確認できます。メールアドレスには独自の落とし穴があり、メールアドレスの正規表現ガイドで扱っています。