正規表現は「文字列のパターンを言葉で書き表す記法」です。置換・検索・入力チェックの3つで使う場面が多く、覚えると作業が一気に速くなります。一方で、書いたパターンが意図どおり動いているかは、実際に文字列を当ててみないと分かりません。
このツールは、パターンとテスト文字列を入れるとその場でマッチ箇所を色分けし、キャプチャグループの中身まで表に出します。入力内容はブラウザの中だけで処理され、サーバーには一切送信されません。業務で使っているログやメールアドレスをそのまま貼っても外部に出ません。
正規表現テスター
パターンとテスト文字列を入れると、その場でマッチ箇所を色分けして表示します。入力内容はブラウザの中だけで処理され、どこにも送信されません
スラッシュで囲む必要はありません。パターンだけを入力してください
- MATCHES
- 0
- GROUPS
- 0
- LENGTH
- 0
正規表現でつまずきやすい3つのポイント
1. ドット(.)は「改行以外の何でも1文字」
. は万能に見えますが、既定では改行だけは対象外です。複数行のログに対して <div>.*</div> と書いても、途中で改行が入っていると一致しません。改行も含めたいときは s フラグ(dotAll)を付けてください。上のツールでは「ドットが改行にも一致」にチェックを入れると挙動の違いを確認できます。
2. * と + は「できるだけ長く」取りにいく
これを貪欲マッチと呼びます。<a>リンク</a><a>2つ目</a> に対して <a>.*</a> を当てると、1つ目の開始タグから最後の終了タグまでを1件として飲み込みます。最短で止めたいときは ? を付けて <a>.*?</a> と書きます。上のツールの「HTMLタグ」プリセットは、貪欲さを避けるために [^>]* という書き方を使っています。
3. 特殊文字は「エスケープ」がいる
. * + ? ^ $ ( ) [ ] { } | \ / はそれぞれ意味を持つ記号です。文字そのものとして扱いたいときは直前にバックスラッシュを置きます。たとえばドメイン名の中のドットは \. と書かないと「何でも1文字」として扱われ、takumi-dx-net のような文字列にも一致してしまいます。
そのまま使える正規表現チートシート
頻度の高いものだけを、実務で使う順に並べました。上のツールにコピーすればすぐ試せます。
| 書き方 | 意味 | 例 |
|---|---|---|
[0-9] / \d | 数字1文字 | \d{3} は数字3桁 |
[a-z] | 英小文字1文字 | [a-zA-Z]+ は英字の連続 |
\w | 英数字とアンダースコア | 日本語は含まれない |
\s | 空白・タブ・改行 | \s{2,} は連続空白 |
^ / $ | 行または文字列の先頭・末尾 | ^ERROR は行頭のERROR |
* / + / ? | 0回以上 / 1回以上 / 0か1回 | colou?r は color と colour |
{n,m} | n回以上m回以下 | \d{3,4} は3〜4桁 |
( ) | キャプチャグループ | 置換時に $1 で参照 |
(?: ) | キャプチャしないグループ | まとめたいだけのとき |
| | または | jpg|png|gif |
[^ ] | 否定(〜以外) | [^0-9] は数字以外 |
\b | 単語の境界 | \bcat\b は concatenate に一致しない |
日本語を扱うときの注意点
日本語のテキストを相手にする場合、\w や [a-zA-Z] は使えません。文字種で絞り込むにはUnicodeの範囲を直接指定します。
- ひらがな:
[\u3041-\u3096] - カタカナ:
[\u30A1-\u30F6](長音符\u30FCは別途追加) - 漢字(常用の範囲):
[\u4E00-\u9FFF] - 全角英数字:
[\uFF01-\uFF5E]
絵文字や一部の漢字はサロゲートペアという2文字ぶんの内部表現になっているため、u フラグを付けないと1文字として扱われません。日本語や絵文字を含むテキストでは、とりあえず u フラグを付けておくのが安全です。
書いた正規表現が「固まる」ことがある理由
(a+)+$ のように繰り返しの中に繰り返しが入ったパターンは、条件によって照合の組み合わせが爆発的に増え、処理が返ってこなくなることがあります。これをReDoS(正規表現のサービス拒否)と呼び、Webアプリの入力チェックに使うと攻撃の入口になり得ます。
対策はシンプルで、繰り返しの入れ子を避けることと、何でも一致する .* をできるだけ使わないことです。上のツールはテスト文字列を2万文字、マッチ件数を2000件で打ち切るようにしていますが、パターン自体が重い場合はブラウザが一時的に反応しなくなることがあります。その場合はタブを閉じて開き直してください。
置換で使う|キャプチャした部分を並べ替える
正規表現は検索だけの道具ではありません。括弧で囲んだ部分を、置換後に呼び出せます。大量のデータを一括で整形するときに効きます。
| やりたいこと | 検索 | 置換 |
|---|---|---|
| 日付の順番を入れ替える 2026/08/23 → 23-08-2026 | (\d{4})/(\d{2})/(\d{2}) | $3-$2-$1 |
| 姓名を入れ替える 山田 太郎 → 太郎 山田 | (\S+)\s+(\S+) | $2 $1 |
| 末尾の空白を削除 | [ \t]+$ | (空) |
| 連続する空行を1行に | \n{3,} | \n\n |
| CSVの列を入れ替える | ^([^,]+),([^,]+) | $2,$1 |
置換の記法は環境によって $1 と \1 に分かれます。エディタなら $1、コマンドラインのsedなら \1 が一般的です。実行前に必ず、置換対象の件数を確認してください。想定より多いなら、パターンが広すぎます。
先読み・後読み|「その文字を含めずに」探す
「価格の数字だけがほしい。円という文字は要らない」といった場面で使うのが、先読み(lookahead)と後読み(lookbehind)です。条件としては使うが、マッチ結果には含めないという書き方です。
| 記法 | 意味 | 例 |
|---|---|---|
(?=...) | 後ろがこれに一致する(肯定先読み) | \d+(?=円) → 「1200円」から 1200 だけ |
(?!...) | 後ろがこれに一致しない(否定先読み) | \d+(?!円) → 円が続かない数字 |
(?<=...) | 前がこれに一致する(肯定後読み) | (?<=¥)\d+ → 「¥1200」から 1200 だけ |
(?<!...) | 前がこれに一致しない(否定後読み) | — |
後読みは、環境によって使えない場合があります。使う前に、このツールで実際に動くか確認してください。使えない環境では、括弧でキャプチャして必要な部分だけ取り出す方法で代替できます。
正規表現を使うべきでない場面
強力な道具ですが、向かない対象があります。無理に使うと、動いているように見えて例外で壊れるコードになります。
| 対象 | なぜ向かないか | 代わりに使うもの |
|---|---|---|
| HTML・XML | 入れ子の構造を正規表現では正しく表現できない | 専用のパーサー(DOMParserなど) |
| JSON | 同上 | JSON.parse。JSON整形ツール |
| メールアドレスの厳密な検証 | 規格上の正しい形が非常に複雑。厳密にすると実在する住所を弾く | 「@が1つある」程度の簡易チェック+実際に確認メールを送る |
| CSV(引用符つき) | フィールド内のカンマや改行を扱えない | CSVパーサー |
| URLの解析 | 仕様が複雑 | URLオブジェクト。URL分解ツール |
判断の目安は、「入れ子になりうるか」です。入れ子がある構造は、正規表現の守備範囲外だと考えてください。逆に、1行の中の決まった形(電話番号、郵便番号、ログの1行)は正規表現が最も得意とする領域です。
よくある質問
入力した文字列はどこかに保存されますか?
保存されません。パターンもテスト文字列も、お使いのブラウザの中だけで処理しています。通信は発生せず、ページを閉じた時点で消えます。
ここで動いたパターンは、そのままPHPやPythonでも使えますか?
基本的な書き方は共通ですが、完全互換ではありません。このツールはJavaScriptの正規表現エンジンで動いています。PHPの preg_match やPythonの re では、区切り文字の要否、後読み(lookbehind)の対応状況、フラグの書き方が異なります。使う言語のドキュメントで一度確認してください。
キャプチャグループの「$1」はどう使うのですか?
置換のときに使います。たとえば ([0-9]{4})-([0-9]{2})-([0-9]{2}) でマッチさせ、置換文字列を $3/$2/$1 にすると 2026-08-22 が 22/08/2026 になります。上のツールの表で $1、$2 に何が入っているかを確認してから置換すると失敗しません。
マッチ件数に「+」が付くのはなぜですか?
ブラウザが固まらないよう2000件で打ち切っているためです。実際にはそれ以上一致しています。件数を正確に数えたい場合は、テスト文字列を分割して試してください。