JavaScript 正規表現テスター
正規表現を入力すると、すべての一致箇所が入力と同時にハイライトされます。キャプチャグループ、置換プレビュー、すぐ使えるパターン集も備えています。
ブラウザ内で動作登録不要アップロードなし
一致箇所をハイライト
$1、$<name>、$&(一致全体)が使えます
一致の詳細
| # | 位置 | 一致 | グループ |
|---|
正規表現チートシート
| . | 改行以外の任意の文字(s 指定時はすべて) |
| \d \w \s | 数字、単語文字、空白 |
| \D \W \S | 数字以外、単語文字以外、空白以外 |
| [abc] [^abc] | a、b、c のいずれか / いずれでもない |
| [a-z0-9] | 文字範囲 |
| \p{L} \p{N} | Unicode の文字 / 数字(u が必要) |
| ^ $ | 入力の先頭 / 末尾(m 指定時は行の先頭 / 末尾) |
| \b \B | 単語境界 / 単語境界以外 |
| * + ? | 0 回以上、1 回以上、0 または 1 回 |
| {n} {n,} {n,m} | ちょうど n 回、n 回以上、n〜m 回 |
| *? +? ?? | 最短一致(できるだけ少なく) |
| a|b | a または b |
| (…) | キャプチャグループ($1 で参照) |
| (?<name>…) | 名前付きグループ、$<name> |
| (?:…) | 非キャプチャグループ |
| \1 \k<name> | 後方参照 |
| (?=…) (?!…) | 先読み / 否定先読み |
| (?<=…) (?<!…) | 後読み / 否定後読み |
| \. \* \\ | エスケープしたリテラル文字 |
| \n \t \r | 改行、タブ、復帰(CR) |
| \uFFFF | Unicode コード単位 |
| \u{1F600} | コードポイント(u が必要) |
| $& | 置換文字列内での一致全体 |
| $` $' | 一致の前 / 後のテキスト |
正規表現テスターの使い方
- パターンをスラッシュの間に入力します。前後の
/は不要です。 g(すべての一致)、i(大文字小文字を無視)、m(複数行)などのフラグを切り替えます。- テスト用のテキストを貼り付けます。一致箇所が右側でハイライトされ、下に位置とキャプチャグループ付きで一覧表示されます。
- 置換にチェックを入れ、
$1や$<name>のような置換文字列を入力すると、String.replaceの結果をプレビューできます。 - パターン集からパターンを選ぶと、検証済みのメールアドレス、URL、IP、日付の正規表現から始められます。
JavaScript の正規表現
このテスターはブラウザ自身の RegExp エンジンを使うので、結果は JavaScript や Node.js の String.match、matchAll、replace、RegExp.exec が返すものとまったく同じです。名前付きグループ (?<name>…)、後読み (?<=…)、u フラグでの \p{L} のような Unicode プロパティエスケープ、d フラグでの一致インデックスなど、モダンな構文にも対応しています。
各フラグの働き
| フラグ | 名前 | 効果 |
|---|---|---|
g | global | 最初の一致で止まらず、すべての一致を探します。 |
i | ignoreCase | 大文字と小文字を区別せずにマッチします。 |
m | multiline | ^ と $ が各行の先頭と末尾にマッチします。 |
s | dotAll | . が改行にもマッチします。 |
u | unicode | パターンをコードポイント単位で扱い、\p{…} と \u{…} を有効にします。 |
y | sticky | 現在の lastIndex の位置でのみマッチします。 |
d | hasIndices | 各キャプチャグループの開始位置と終了位置を返します。 |
壊滅的バックトラッキングからの保護
(a+)+$ や (\w|\d)*x のような入れ子の量指定子を持つパターンは、ほぼ一致する入力に対して指数関数的な時間がかかることがあります。通常のウェブページではタブがフリーズしてしまいます。このツールでは、すべてのマッチングがバックグラウンドの Web Worker で実行され、1 秒で停止されるため、ブラウザが固まる代わりにわかりやすい警告が表示されます。同じパターンが本番コードにあれば ReDoS 脆弱性になりうるので、警告は修正すべきバグとして扱ってください。
より良い正規表現を書くコツ
- 値全体を検証するときは、パターンを
^と$で固定しましょう。そうしないと、文字列のどこかに一致するだけで通ってしまいます。 .*よりも[^"]*のような具体的なクラスを使いましょう。高速で、余計なマッチも防げます。- キャプチャした値が不要なら、非キャプチャグループ
(?:…)を使いましょう。 - グループには名前を付けましょう。
match.groups.yearはmatch[1]より読みやすくなります。
よくある質問
このテスターはどの正規表現の方言を使っていますか?
ブラウザ組み込みの
RegExp による JavaScript(ECMAScript)です。構文の大部分は PCRE、Python、Java と共通ですが、強欲な量指定子、アトミックグループ、(?i) のようなインライン修飾子は JavaScript では使えません。パターンが 1 件しか一致しないのはなぜですか?
g(global)フラグがないと、JavaScript は最初の一致で止まります。すべての出現箇所を見つけるには g を有効にしてください。置換文字列でグループを参照するには?
番号付きグループには
$1、$2…、名前付きグループには $<name>、一致全体には $&、ドル記号そのものには $$ を使います。テスターがタイムアウトで停止したのはなぜですか?
入力に対してパターンの処理に 1 秒以上かかったためで、ほとんどの場合は壊滅的バックトラッキングが原因です。
(x+)+ のような入れ子の量指定子や (a|a)* のような重複する選択肢を探し、各文字が 1 通りにしかマッチしないよう書き直してください。テストデータはどこかに送信されますか?
いいえ。マッチングはブラウザ内の Web Worker でローカルに実行されます。パターンとテキストはご自身のブラウザにのみ保存されるので、再訪問したときもそのまま残っています。