正規表現テスターは、パターンがテキストのどこに一致するかをその場で見せます
正規表現(regular expression)は、テキストの中から探したい形を記号で書き表したルールです。\d{4} は「数字4つ」、[ぁ-ん]+ は「ひらがな1文字以上」を意味します。ルールは短くても、記号が1つ違うだけで探す範囲が大きく変わるため、コードに組み込む前に実際のテキストに当てて確かめる作業が欠かせません。
このツールは、いま使っているブラウザの JavaScript 正規表現エンジンでパターンを実際に実行します。一致した部分はテキストの上にすぐ塗り、キャプチャグループは色で区別して一致の表の列にまとめます。パターンは各部分の意味に分解して表示するので、他の人が書いた正規表現を読み解くときにも役立ちます。
正規表現をコードに入れる前に試す理由
正規表現の間違い方は2通りあります。探すべきものを取りこぼす場合(携帯番号のチェックがハイフンなしの 08012345678 を拒否する)と、探してはいけないものまで拾う場合(日付パターンが 2026-13-45 も受け入れる)です。どちらも文法エラーではないので、ブラウザは何も警告しません。一致すべき例と一致してはいけない例を一緒に入れて試すのが、いちばん確実な確認方法です。
3つ目の問題は速度です。2019年7月2日、Cloudflare は WAF(ウェブアプリケーションファイアウォール)のルールに新しい正規表現を配備しました。その結果バックトラッキングが急増し、HTTP 処理の CPU が100%近くまで使われて、サービスが27分間止まりました。同社が公開した事後報告によると、原因は長いパターンの中の .*(?:.*=.*) というごく短い部分でした。同じテキストを探すパターンでも、書き方しだいで試行回数が数百倍以上に増えることがあります。実際の長さのテキストで試す必要があるのはそのためです。
正規表現を事前に試しておくと役立つ場面は次のとおりです。
- 入力チェック: 会員登録フォームの電話番号・メールアドレス・パスワード条件を決めるとき、通すべき例と弾くべき例を1行ずつ入れて試します。
- 値の抽出: ログ・CSV・コピーした表から、日付・注文番号・IP アドレスだけを取り出すとき、グループの値が正しく分かれているかを確かめます。一致の表はそのままスプレッドシートに貼り付けられます。
- 一括置換: エディタやコードで検索置換を実行する前に、置換される位置と置換後の結果を確認します。
- 他人の正規表現を読む: 古いコードにあるパターンが何を探しているのかを部分ごとに読み解き、遅くなりそうな形がないか確かめます。
使い方
- パターン欄に正規表現を入れます。前後のスラッシュは不要です。
/abc/giのようにリテラルごと貼り付けると、パターンとフラグに分けて入ります。 - 右側の文字ボタンでフラグをオンにします。複数の箇所を探すには
gをオンにします。 - テストするテキスト欄にテキストを貼り付けると、一致した部分がすぐに塗られ、上のステータス行に一致数が表示されます。
- 入力チェック用のパターン(
^…$)は行ごとに判定をオンにし、例を1行に1つずつ入れます。通った行には ✓、通らなかった行には ✗ が付きます。 - 下の一致の表でグループの値を確認し、番号ボタンを押すとその一致がテキスト上で点滅します。置換タブでは置換後の文字列を入れて結果を確認でき、コードタブでは JavaScript のコードとして持ち出せます。
パターンの分解行の読み方
パターンの分解行は、パターンをエンジンが読む単位に区切り、各部分の上に元の記号、下に意味を表示します。量指定子(+、{4} など)は直前の部分に付けて「数字4回」のようにまとめて読みます。部分の下にある太い線の色は、その部分が属するキャプチャグループを表します。同じ色がテキスト上のグループの下線と、一致の表の列見出しにも使われます。点線の枠は、値を保存しないまとまり、先読み・後読み、「または」です。
| 部分 | 意味 | グループの色 |
|---|---|---|
(?<y> | グループ y の開始(1番グループ) | 1番の色 |
\d{4} | 数字 0~9 を4回 | 1番の色 |
) | グループ y の終了 | 1番の色 |
- | ハイフンそのもの | なし |
(?<m> \d{2} ) | グループ m: 数字を2回 | 2番の色 |
オレンジの枠は、実行がとても遅くなる可能性のある形です。繰り返しの中にさらに繰り返しがある (a+)+ や、同じ繰り返しが連続する .*.* を見つけて表示します。赤い枠は、ブラウザが文法エラーとして拒否したパターンで、エラーの位置を指します。
よく使う文法
下の表の「探すもの」は、このツールと同じ JavaScript エンジンで例のテキストに実際に実行した結果です。
| 記号 | 意味 | 例のパターン | 例のテキスト | 探すもの |
|---|---|---|---|---|
\d | 数字 0~9 の1文字 | \d+ | A棟 102号室 | 102 |
\w | 英数字・アンダースコア(_)の1文字 | \w+ | user_01 さん | user_01 |
. | 改行以外の任意の1文字 | a.c | abc a-c a↵c | abc, a-c |
[ ] | かっこ内の文字のどれか1つ。- は範囲 | [ァ-ヶー]+ | Roberin ロベリン | ロベリン |
[^ ] | かっこ内の文字以外の1文字 | [^0-9]+ | 010-1234 | - |
^ $ | テキスト(または行)の先頭と末尾 | ^\d+$ | 2026 | 2026 |
{n,m} | 直前の部分を n 回以上 m 回以下 | \d{2,3} | 1 22 333 4444 | 22, 333, 444 |
| | または | cat|dog | hotdog cat | dog, cat |
\b | 単語の境界(英数字が基準) | \bcat\b | cat category | cat |
(?= ) | 先読み: 直後にこれが必要(その文字は一致に含めない) | \d+(?=円) | 3個 5000円 | 5000 |
(?<= ) | 後読み: 直前にこれが必要 | (?<=\$)\d+ | $30 and 40 | 30 |
\1 | 1番のグループが取り込んだ文字列をもう一度 | (\w)\1 | book keeper | oo, ee |
+? *? | できるだけ短く繰り返す | <.+?> | <b>x</b> | <b>, </b> |
8つのフラグが変えるもの
フラグはパターン全体にかかる設定です。同じパターンと同じテキストでも、フラグによって結果が変わります。
| フラグ | 働き | 例のパターン · テキスト | オフの結果 | オンの結果 |
|---|---|---|---|---|
g | 最初の一致で止まらず、すべて探す | a · a a a | a | a, a, a |
i | 大文字小文字を同じに扱う | abc · ABC | なし | ABC |
m | ^ $ が各行に一致する | ^\d · 1↵2 | 1 | 1, 2 |
s | . が改行にも一致する | a.b · a↵b | なし | a↵b |
u | 絵文字などを1文字として読み、\p{…} を使える | . · 😀 | 半分が2つ | 😀 |
v | u に、文字集合の差(--)・共通部分(&&)を加える | [\p{L}--[a-z]] · aZあ | 構文エラー | Z, あ |
y | 直前の一致の終わりにそのまま続く場合だけ | \d · 12a3 (g と併用) | 1, 2, 3 | 1, 2 |
d | グループごとの開始・終了位置(indices)も返す | 探す結果は変わりません。このツールはフラグに関係なく位置を求め、一致の表に使っています。 | ||
u と v は同時にオンにできません。一方をオンにすると、このツールがもう一方をオフにしてステータス行で知らせます。v フラグや (?i:…) のような修飾子など、最近できた文法は、古いブラウザでは文法エラーになることがあります。
キャプチャグループ、名前付きグループ、後方参照
括弧 ( ) で囲んだ部分は、一致の中で別に保存されるキャプチャグループになります。開き括弧の順に 1、2、3 番が付き、(?<y>…) のように名前を付けると、番号と名前の両方を持ちます。まとめるだけで保存する必要がなければ (?:…) を使います。保存しないまとまりは番号を消費しないので、後ろのグループの番号はずれません。
パターンの中で、前のグループが取り込んだ文字列をもう一度探すには、後方参照の \1 や \k<名前> を使います。(\w)\1 は、同じ文字が2つ続く場所を探します。グループが繰り返されると((\d)+)、最後の繰り返しで取り込んだ値だけが残る点も覚えておいてください。一致の表で「—」と表示されるセルは、その一致で使われなかったグループです((a)|(b) で b が一致したときの1番グループ)。「空」は、グループが空の文字列に一致した場合です。
置換後の文字列に使う記号
置換タブの結果は、JavaScript の String.prototype.replace と同じ規則で作ります。下の表は、テキスト「注文 2026-10-22 出荷」にパターン (\d{4})-(\d{2})-(\d{2}) を使った結果です。
| 記号 | 意味 | 置換後の文字列 | 結果 |
|---|---|---|---|
$1~$99 | 番号付きグループ | $3.$2.$1 | 注文 22.10.2026 出荷 |
$<名前> | 名前付きグループ(パターンに名前があるとき) | $<m>月$<d>日 | 注文 10月22日 出荷 |
$& | 一致した文字列全体 | [$&] | 注文 [2026-10-22] 出荷 |
$` | 一致の前のテキスト全部 | ($`) | 注文 (注文 ) 出荷 |
$' | 一致の後ろのテキスト全部 | ($') | 注文 ( 出荷) 出荷 |
$$ | $ 記号そのもの | $$1 | 注文 $1 出荷 |
\n | 改行ではなく、文字の \ と n | $1\n$2 | 注文 2026\n10 出荷 |
グループ数より大きい番号($7)は文字のまま残り、$0 もグループではなく文字として残ります。改行を入れたいときは、置換後の文字列欄で Enter を押して実際に行を変えます。コードの中では、文字列に "\n" を書けば改行になります。
日本語の文字を探すとき
JavaScript の \w と \b は、英数字とアンダースコアだけを「単語の文字」と見なします。u フラグを付けても同じなので、\w+ では日本語を1文字も拾えません。\b も日本語の単語の境目を見つけられず、「これは日本語です」というテキストに \b\S+\b を当てても一致は0件です。日本語は分かち書きをしないので、英語のように空白と単語境界を頼りに切り出すことはできません。
代わりに文字の範囲で指定します。ひらがなは U+3041(ぁ)から U+3093(ん)までを [ぁ-ん]、カタカナは U+30A1(ァ)から U+30F6(ヶ)までを [ァ-ヶ] で表せます。長音符「ー」(U+30FC)はこの範囲の外なので、[ァ-ヶー] のように別に書き足します。濁点付きの「ゔ」(U+3094)も [ぁ-ん] には入りません。漢字は u フラグを付けて \p{Script=Han} と書くと、「々」まで含めて拾えます。
| パターン | 探すもの | 説明 |
|---|---|---|
\w+ | abc, 123 | 日本語は1文字も拾わない |
[ぁ-ん]+ | ひらがな | ひらがなの範囲 |
[ァ-ヶー]+ | カタカナ, テスター | カタカナの範囲に長音符 ー を足したもの |
\p{Script=Han}+ (u) | 漢字 | 漢字(Han)すべて |
\p{Script=Katakana}+ (u) | カタカナ, テスタ | 長音符 ー を取りこぼして「テスタ」で切れる |
\p{scx=Katakana}+ (u) | カタカナ, テスター | 長音符 ー まで含めてカタカナ全体 |
\b漢字\b | なし | \b は日本語を単語の文字と見ない |
長音符「ー」は、文字種(Script)としてはひらがなにもカタカナにも属さない Common 扱いです。そのため \p{Script=Katakana}+ だと「テスター」が「テスタ」で切れます。\p{scx=Katakana}(Script_Extensions)なら長音符まで含めて拾えるので、カタカナ語を丸ごと探したいときはこちらを使うか、範囲指定に ー を足してください。
日本語では単語の境目を \b で取れないので、文字の範囲で区切りを表します。例の「重なった語」のパターン ([ぁ-んァ-ヶー一-龠]{2,}?)\1 は、2文字以上の同じ並びが連続する場所を、できるだけ短い単位で探します。
行ごとに判定と m フラグの違い
m フラグは、テキスト全体を一度に検査しながら、^ と $ が各行の先頭と末尾にも一致するようにします。そのため一致が行をまたぐことがあり(\s は改行にも一致します)、結果は「何件一致」としてしか出ません。行ごとに判定は、行を1つずつ切り出して、それぞれを独立したテキストとして検査します。一致が行をまたがず、行ごとに通過(✓)か不通過(✗)が決まり、ステータス行に「通過 3 / 6 行」のように表示されます。会員登録フォームのように、入力値1つ全体を検査するパターンを複数の例で試すなら、行ごとに判定が実際の使い方と同じです。置換も、行ごとに行ってから再びつなぎ合わせます。
遅いパターンと1秒の制限
JavaScript の正規表現エンジンは、一致する道が見つかるまで、前の選択を取り消して別の道を試します(バックトラッキング)。同じ文字を複数の繰り返しで分け合えるパターンは、一致しないテキストに出会うと、分け方の場合の数をすべて試します。Cloudflare の報告書は、問題の部分を .*.*=.* に縮めて説明し、x=x は23ステップで一致し、x= の後ろに x が20個続くと一致までに555ステップ、= がなく x だけが20個のテキストは不一致と判定するまでに4,067ステップかかると書いています。末尾に ; を1つ足した .*.*=.*; では、x= の後ろに x が20個続くテキストが5,353ステップかけて失敗します。繰り返しの中に繰り返しがある (a+)+$ は、テキストが1文字長くなるたびに試行がおよそ2倍に増えます。
このツールは実行を別の作業領域(Web Worker)で行い、1秒以内に終わらなければ作業を終了して知らせます。画面は固まりません。パターンの分解行にあるオレンジの枠が原因である可能性が高いです。直し方は、おおむね次の3つです。
- 繰り返しの中の繰り返しをなくします。
(\w+\s?)+$の代わりに\w+(?:\s\w+)*$のように、繰り返しのたびに必ず別の文字(ここでは空白)が挟まるようにします。 .*の代わりに、止まる文字を除いた集合を使います。.*.*=.*は[^=]*=.*に直すと、同じテキストを探しながら、やり直す道がほとんどなくなります。- 同じテキストを複数の方法で分けられる選択肢を1つにまとめます。
(\d|\d\d)+$は数字の列を1桁と2桁に分けるあらゆる方法を試しますが、\d+$なら一度で終わります。
言語ごとの違い
正規表現の文法は、言語によって少しずつ違います。このツールの結果は JavaScript 基準なので、他の言語へ移すときは下の違いを確認してください。表は Node.js 26、Python 3.14、PHP 8.5(PCRE2 10.44)で実際に実行し、Java は Java 21 の公式ドキュメントで確認しました。
| 項目 | JavaScript | Python re | Java | PHP preg_* |
|---|---|---|---|---|
| 名前付きグループ | (?<n>…) | (?P<n>…) のみ。(?<n>…) はエラー | (?<n>…) | (?<n>…)、(?P<n>…) |
| 置換後の文字列でのグループ | $1、$<n> | \1、\g<n> | $1、${n} | $1、\1、${1}(名前は不可) |
\w が日本語に一致するか | いいえ(u を付けても) | はい(文字列パターンの既定。re.ASCII ならいいえ) | いいえ(UNICODE_CHARACTER_CLASS ならはい) | いいえ(/u ならはい) |
所有量指定子 a++、アトミックグループ (?>…) | なし(文法エラー) | あり(3.11 から) | あり | あり |
| フラグの書き場所 | /…/gi の後ろの文字 | re.I などの引数。すべて探すのは findall・sub | Pattern.CASE_INSENSITIVE などの引数 | 区切り文字の後ろの文字 /…/iu |
後読み((?<=…))の中に書ける長さも違います。JavaScript は (?<=a+) のように長さが決まっていないパターンも受け付けますが、Python は固定長だけを受け付けます。PHP は PCRE2 10.43 から、長さの上限があるパターン((?<=a{1,3})、既定で最大255文字)まで受け付けます。Python の \d は全角数字の「12」も数字と見なしますが、JavaScript の \d は 0~9 だけです。
間違えやすいケース
- 文字列で作るときにバックスラッシュを1つしか書かない: JavaScript の文字列
"\d+"はd+になります。new RegExp("\\d+")のように2つ書く必要があります。コードタブの「文字列から作る場合」の行は、この処理を済ませた形です。 - ピリオドをそのまま書く:
1.5は「125」にも一致します。ピリオドそのものは1\.5と書きます。 - g フラグ付きの正規表現で
test()を何度も呼ぶ: 正規表現が最後の位置(lastIndex)を覚えているため、同じテキストに対する結果が true、false、true と交互に出ます。判定だけなら g を外すほうが安全です。 - 貪欲な
.*:<.+>は「<b>x</b>」全体を一度に拾います。タグを1つずつ拾うなら<.+?>か<[^>]+>を使います。 - チェック用パターンを複数行のテキストにそのまま当てる:
^…$は、m フラグがないとテキスト全体を1つの塊として見るため、複数行だと0件になります。例を複数試すときは行ごとに判定をオンにします。 - メールアドレスを正規表現1つで完璧に検査しようとする: 標準が許すアドレスは非常に多様で、簡単なパターンは一部を取りこぼしたり、余計なものを通したりします。例のメールのパターンは形をおおまかに選別するためのもので、実際の確認は確認メールで行うのが一般的です。
限界
- 結果は、いま使っているブラウザの JavaScript 正規表現エンジンが基準です。Python・Java・PHP・エディタの正規表現は、上の表のように文法や結果が異なることがあります。
- パターンは1,000文字、テストするテキストは50,000文字、置換後の文字列は2,000文字、置換結果は200,000文字までです。一致の表とテキスト上の塗りは最初の1,000件まで表示され、一致数と置換結果には全体が含まれます。
- 実行が1秒を超えると止まります。動作の遅い端末では、同じパターンでもより長くかかることがあります。
- パターンの分解行の「遅くなる可能性」の表示は、よくある形だけを探す警告です。表示がないからといって、あらゆるテキストで速いとは限りません。
- 一致の表の「行:列」は JavaScript の文字列の位置(UTF-16)が基準なので、絵文字1つは2つ分と数えます。
- 入力したパターンとテキストはブラウザの中だけで処理し、サーバーには送りません。URL や保存領域にも残さないので、再読み込みすると例に戻ります。
基準: 文法と置換の規則は ECMAScript 仕様と MDN、他の言語は Python・Java・PHP の公式ドキュメントと PCRE2 の変更履歴を、2026年10月22日に確認しました。表の例は Node.js 26(V8)、Python 3.14、PHP 8.5 で実行し、同じ結果になることを確かめています。
出典
- 01ECMAScript: RegExp (Regular Expression) ObjectsJavaScript の正規表現の文法と実行規則
- 02ECMAScript: GetSubstitution$1、$<名前>、$&、$`、$'、$$ の処理順
- 03MDN: Regular expressionsフラグ、修飾子 (?i:…)、v フラグ、名前付きグループ
- 04MDN: String.prototype.replace()置換後の文字列の特殊記号
- 05MDN: Character class escape\d、\w、\s が受け付ける文字
- 06Cloudflare: Details of the Cloudflare outage on July 2, 2019WAF の正規表現のバックトラッキングによる27分の障害、.*.*=.* のステップ数
- 07Python: re — Regular expression operations(?P<名前>…)、\g<名前>、固定長の後読み、3.11 の所有量指定子
- 08Java 21: Pattern\w = [a-zA-Z_0-9](UNICODE_CHARACTER_CLASS なしの場合)、所有量指定子
- 09PHP: preg_replace置換後の文字列の $n、\n、${n}
- 10PCRE2 ChangeLog10.43: 長さに上限のある可変長の後読み(既定で255文字)
- 11Unicode: Hiragana (3040–309F)ひらがなのブロック
- 12Unicode: Katakana (30A0–30FF)カタカナのブロック、長音符 U+30FC
よくある質問
パターンに / とフラグまで付けて貼り付けてもいいですか?
パターン欄にはスラッシュの内側だけを入れ、フラグは右側の文字ボタンでオンにします。/abc/gi のようにリテラルごと貼り付けると、このツールがパターン abc とフラグ g、i に分けて入れます。手で入力するときにスラッシュを入れると、スラッシュも探す文字として読まれます。
複数の箇所に一致するのに、1か所しか塗られないのはなぜですか?
g フラグがオフだと、最初の一致で止まります。このときステータス行に「g をオンにすると何件か」も表示されるので、g ボタンを押してすべてを探してください。
\w が日本語に一致しないのはなぜですか?
JavaScript の \w は英数字とアンダースコアだけを受け付け、u フラグを付けても同じです。ひらがなは [ぁ-ん]、カタカナは長音符を足した [ァ-ヶー]、漢字は u フラグと \p{Script=Han} で探します。\b も日本語の単語の境目を見つけられません。
m フラグと「行ごとに判定」はどう違いますか?
m フラグは、テキスト全体を一度に検査しながら ^ と $ を各行に一致させます。行ごとに判定は、行を1つずつ独立したテキストとして検査し、行ごとに通過・不通過を表示します。入力値1つを検査するパターンを複数の例で試すなら、行ごとに判定が合っています。
置換後の文字列にグループの値を入れるにはどうしますか?
番号付きグループは $1・$2、名前付きグループは $<名前>、一致全体は $& で入れます。置換タブの記号ボタンを押すと、カーソルの位置に入ります。\n は改行ではなく文字のまま入るので、行を変えたいときは Enter を押してください。
1秒の制限で止まるのは、パターンが間違っているからですか?
文法が正しくても、バックトラッキングが急増する形の可能性があります。(a+)+ のような繰り返しの中の繰り返しや、.*.* のように同じ繰り返しが連続する形は、一致しない長いテキストで試行が急激に増えます。パターンの分解行のオレンジの枠を見て、繰り返しをまとめるか、.* の代わりに [^=]* のような狭い集合を使ってください。
Python・Java・PHP でも結果は同じですか?
基本の文法は似ていますが、違いがあります。Python は名前付きグループを (?P<名前>…) と書き、\w が日本語も受け付けます。PHP は /u を付けると \w が日本語を受け付けます。置換後の文字列のグループ表記も \1、${名前} のように異なります。本文の「言語ごとの違い」の表を確認してください。
入力したテキストはサーバーに送信されますか?
送信しません。パターンとテキストはブラウザの中の作業領域(Web Worker)だけで実行され、URL や保存領域にも残しません。再読み込みすると最初の例に戻ります。