正規表現テスター・ビルダーベータ
正規表現のテスト・解説とブロックでの作成
このツールはまだ安定化中のベータ版です。結果に違和感があればお知らせください。
正規表現のテスト・解説とブロックでの作成
よく使うパターン
一致の詳細
パターンの解説
この正規表現に一致する文字列の例
現在のパターンに一致する文字列をランダムに生成します。パターンが意図どおりに動くかをすばやく確かめるためのものです (アンカーがない場合は部分一致のこともあります)。
正規表現に一致しなかった組み合わせは除外しました。
置換プレビュー
例から正規表現を作る
一致させたい例を1行に1つずつ入力してください。すべてに一致する正規表現のたたき台を作ります (完成品ではなく出発点です)。
読み込み中…
処理中…
0.0
停止していません。計算が終わると結果が表示されます。
正規表現テスター・ビルダーについて
このツールは入力したパターンをブラウザのnew RegExp(パターン, フラグ)でコンパイルして実行します。結果はJavaScript(ECMAScript)の正規表現エンジン基準です。Python、Java、PCRE(PHP)、grepでは同じパターンでも動きが変わることがあるので、他の言語に持っていく場合は下の違いを確認してください。
モードは2つです。テストモードはマッチ・キャプチャグループ・置換結果を表示し、パターンをトークンごとに説明します。ビルダーモードは「数字」「文字そのまま」などのブロックを積むか、例の文字列を入れて下書きを作ります。
JavaScriptの正規表現が他と違う点
- gフラグがないと最初のマッチだけを探します。ツールもその旨を表示します。
- 名前付きグループは(?<name>...)、置換では$<name>、番号は$1、マッチ全体は$&です。Pythonのreは(?P<name>...)と\g<name>を使います。
- 後読み(?<=...)・(?<!...)は可変長も使えます。Pythonのreは固定長のみです。ただしSafariが後読みに対応したのは2023年3月(16.4)で、それ以前のiOSでは構文エラーになり、スクリプト全体が動かなくなります。
- PCREやJavaにあるアトミックグループ(?>...)や強欲な量指定子a++はJavaScriptにありません。
- \d・\w・\bはuフラグを付けてもASCII基準です。\wは[A-Za-z0-9_]なので、éや日本語は単語文字になりません。
uフラグで変わること
uなしでは文字列はUTF-16のコード単位で扱われます。絵文字😀はコード単位2つなので^.$にマッチせず、uを付けると1文字としてマッチします。\p{Script=Han}や\p{Script=Hiragana}、\p{L}といったUnicodeプロパティもu(またはv)が必要です。uがないと\pはただの文字pと解釈され、\p{L}+が「p{L}}}」のような文字列にマッチしてしまいます。
大文字小文字の無視(i)も変わります。uなしではſ(長いs、U+017F)とsは同じ文字と見なされませんが、uを付けるとUnicodeのケースフォールディングでマッチします。
破滅的バックトラック:数文字でブラウザが固まる理由
JavaScriptのエンジンはバックトラック型で、失敗すると前の選択を変えて再試行します。^(a+)+$に「aaa…a!」を与えると、aを内側と外側の繰り返しに分ける方法をすべて試し、その数はaが1つ増えるごとにほぼ2倍になります。
このツールのロジックをNode.js(V8)で実行して測ると、a 24個+!で約66ms、26個で約254ms、28個で約958ms、30個で約3.9秒でした。同じ入力で^a+$はaが1万個でも0.1ms未満です。
このツールはマッチングをWeb Workerで実行し、250ms以内に終わらなければ強制終了して「時間がかかりすぎ」と表示するので、ページは固まりません。サーバー側にはこうした保護がないことが多く、1つのリクエストでCPUを占有されます(ReDoS)。入れ子の量指定子をほどき、同じ文字列を複数通りに分けられないようにするのが対策です。(a+)+はa+に、(\w+\s?)+は\w+(?:\s\w+)*に書き換えます。
ビルダーモードで下書きを作る
例の文字列を複数行入れると共通の構造を探して下書きを作ります。010-1234-5678と010-9876-5432からは^\d{3}-\d{4}-\d{4}$ができます。例に合わせた下書きは狭すぎたり広すぎたりするので、テストモードでマッチしてはいけない文字列も試してください。なお「韓国語」ブロックはハングル音節[가-힣]で、日本語の文字には\p{Script=Han}などをuフラグ付きで使います。
例
後読みで金額だけを取り出す
- 入力
パターン (?<=\$)\d+(?:\.\d{2})? フラグ g 文字列 Total $19.99, tax $1.60, 30 items- 結果
19.99, 1.60(2件)
$の後の数字だけがマッチし、$自体は含まれません。30は前に$がないので外れます。
\bがéを知らない場合
- 入力
パターン \bcafé\b フラグ g 文字列 café cafés- 結果
1件:cafésの中のcafé
éが単語文字でないため、「café 」のéと空白の間には境界がなく、「cafés」のéとsの間に境界ができます。直感と逆の結果です。
名前付きグループで日付の順序を変える
- 入力
パターン (?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2}) 置換 $<d>.$<m>.$<y> 文字列 2026-09-22- 結果
22.09.2026(置換1回)
番号ではなく名前を使えば、グループを追加しても置換文字列を直さずに済みます。
使い方
- パターンとフラグを入力するか、よく使うパターンから選びます。
- テスト文字列を貼り付け、マッチとキャプチャを確認します。
- 必要なら置換文字列で結果をプレビューします。
- 書き方がわからなければビルダーモードで下書きを作ります。
よくある質問
ここでは動くのにPythonでエラーになります。
(?<name>)を(?P<name>)に、可変長の後読みを固定長に、置換の$1を\1に変えてください。
「時間がかかりすぎ」と出ます。
破滅的バックトラックです。(x+)+のような入れ子の量指定子を探してまとめてください。
\wで日本語がマッチしません。
JavaScriptの\wはASCIIの英数字と_だけです。uフラグと\p{L}を使ってください。
絵文字が2文字と数えられます。
uフラグを付けてください。
出典
- MDN: 正規表現 (JavaScript)
- MDN: Lookbehind assertion
- MDN: Unicode character class escape
- OWASP: Regular expression Denial of Service (ReDoS)
- Python docs: re
基準日: