正規表現テスター
パターンを入力し、必要なフラグにチェックを入れてテキストを貼り付けてください。入力と同時にすべてのマッチがハイライトされ、位置とキャプチャグループの一覧が表示されます。パターンはブラウザ自身のJavaScript正規表現エンジンで実行されるため、結果は実際のコードと同じになり、テキストが端末の外に出ることもありません。
0 文字 · 0 語 · 0 行
マッチした部分はここに強調表示されます。0 文字 · 0 語 · 0 行
すべてこのブラウザのタブ内で処理されます。テキストがアップロードされたり保存されたりすることはありません。
JavaScript の正規表現トークン
「最初のマッチ」列は、このページをビルドした JavaScript エンジンで各パターンを対応するテキストに実行して得た結果です。
| トークン | 意味 | パターン | テキスト | 最初のマッチ |
|---|---|---|---|---|
\d | 数字 0–9 | /\d+/ | Order 66 shipped | 66 |
\w | 英字、数字、アンダースコア(ASCII) | /\w+/ | snake_case-id | snake_case |
\s | タブや改行を含む空白文字 | /\s+/ | two spaces | |
. | 改行以外の任意の1文字(s フラグ時を除く) | /a.c/ | abc a-c | abc |
^ $ | 入力(m 指定時は行)の先頭と末尾 | /^\w+$/ | single | single |
[abc] | 列挙した文字のいずれか1つ | /[aeiou]/ | rhythm and blues | a |
[^abc] | 列挙していない任意の文字 | /[^0-9]+/ | 2026-10-18 | - |
* + ? | 0回以上、1回以上、0回または1回 | /colou?r/ | color colour | color |
{n,m} | n 回以上 m 回以下 | /\d{2,4}/ | 7 42 1999 123456 | 42 |
(…) | キャプチャグループ | /(\d+)px/ | width: 320px | 320px |
(?<name>…) | 名前付きキャプチャグループ | /(?<h>\d\d):(?<m>\d\d)/ | at 09:45 | 09:45 |
(?:…) | キャプチャしないグループ | /(?:ab)+/ | ababab! | ababab |
a|b | どちらか一方 | /cat|dog/ | hotdog | dog |
\b | 単語の境界 | /\bcat\b/ | concat cat | cat |
(?=…) | 後ろに続く(先読み) | /\d+(?=%)/ | 50 of 75% | 75 |
(?<!…) | 直前にない(否定後読み) | /(?<!\$)\b\d+/ | $30 or 40 | 40 |
\p{L} | 任意の Unicode 文字(u が必要) | /\p{L}+/u | naïve 東京 | naïve |
6つのフラグとそれぞれの効果
g(グローバル)は最初の一致で止まらず、すべての一致を検索します。g がないと、一覧には1件だけが入ります。i は大文字と小文字を区別しません。m(複数行)は、^ と $ をテキスト全体の先頭・末尾ではなく各行の先頭・末尾に一致させます。行末の空白を探すようなパターンで使います。s(dotAll、ES2018で追加)は . が改行にも一致するようになります。u(Unicode)はテキストをコードポイントとして扱うため、絵文字が1文字として数えられ、あらゆる文字体系の文字に一致する \p{L} のようなプロパティエスケープも使えるようになります。y(sticky)は現在の位置ちょうどでのみ一致します。トークナイザーが使うモードです。JavaScriptには一致位置のインデックスを取得する d や、文字クラスでの集合演算用の v もありますが、このテスターでは上記の6つに対応しています。
テストテキストの下には、各一致のインデックスとグループが表示されます。番号付きグループは通常の丸括弧から作られ、(?:…) はキャプチャしないグループになります。(?<year>\d{4}) は名前付きグループを作り、ISO日付のサンプルのように名前で表示されます。よく使うパターンメニューからは、メールアドレス、URL、IPv4アドレス、16進カラー、UUID、重複した単語、行末の空白について、動作確認済みの出発点を挿入できます。メールのパターンは簡易チェックと考えてください。正式なアドレスの文法ははるかに寛容で、本当の確認方法は実際にメッセージを送ることだけです。
後読みと壊滅的バックトラッキング
先読み・後読み(ルックアラウンド)は、文字を消費せずに、ある位置の前後を調べます。先読みの (?=…) と (?!…) は以前からJavaScriptにあります。後読みの (?<=…) と (?<!…) はES2018で登場し、2023年にSafari 16.4が対応したことで主要ブラウザすべてで使えるようになりました。たとえば (?<=\$)\d+ は "$42" から、ドル記号を含めずに 42 を見つけます。他の多くのエンジンと違い、JavaScriptでは任意の長さの後読みが使えます。
JavaScriptのエンジンはバックトラック方式で、経路が失敗すると戻って別の選択肢を試します。(a+)+$ のような入れ子の量指定子は、同じテキストを分割する方法が指数関数的に増えるため、30個の a の後に x が続く文字列で数秒、数文字増えるだけで数時間かかることもあります。これが壊滅的バックトラックで、サーバーではDoS攻撃の一種であるReDoSになります。この欠陥を持つWAFルール1つが、2019年7月2日にCloudflareのネットワークを約30分間停止させました。このテスターはお使いのタブ内で動くため、こうしたパターンではページが固まることがあります。その場合は再読み込みし、2つの量指定子が同じ文字を取り合わないように書き直してください。.* の代わりに [^,]* のような絞った文字クラスを使うか、アンカーを使います。一致ではなくテキスト自体の編集にはテキストツールを、その他の開発者向けユーティリティは開発者ツールのハブをご覧ください。
よくある質問
- 正規表現で1件しかマッチしないのはなぜですか?
- g フラグがオフになっています。g がないと、エンジンは最初の一致で止まります。g をオンにするとすべての一致が一覧表示されます。y フラグだけでも複数見つかりますが、それは一致が連続している場合に限られます。
- JavaScriptの\dは他の文字体系の数字にもマッチしますか?
- いいえ。JavaScriptでは、u フラグを付けても \d は 0〜9 のみ、\w は ASCII の英字・数字・アンダースコアのみに一致します。他の文字体系には、u と合わせて \p{Nd} や \p{L} を使ってください。
- ここでテストしたパターンはPythonやPHPでも同じように動きますか?
- 基本的な構文は共通ですが、細部は異なります。Pythonの名前付きグループは
(?P<name>…)と書き、PHPとPythonにはJavaScriptにない強欲量指定子(possessive)があり、後読みのルールも異なります。使用先のエンジンで再テストしてください。 - ドットや括弧そのものにマッチさせるにはどうすればよいですか?
- バックスラッシュでエスケープします。
\.はピリオド、\[は開き角括弧に一致します。文字クラスの内側ではほとんどの記号がもともとリテラルなので、[.]もドットだけに一致します。 - パターンの入力中にページが固まったのはなぜですか?
- パターンがテキストに対して壊滅的バックトラックを起こした可能性があります。再読み込みしたうえで、
(.*)*や(a+)+のような入れ子の量指定子を避け、各部分ができるだけ少ない文字にだけ一致するようにしてください。