正規表現とは、このテスターが動く仕組み
正規表現(regex)は、文字列の「形」を記号で書き表し、検索・検証・抽出・置換に使う表記法です。「0から始まって、ハイフンがあってもなくてもよい11桁の番号」のように、言葉にすると長い条件を1行で書けるため、フォームの入力チェック、ログの解析、テキストの一括修正、スクレイピング後のデータ整理などに幅広く使われます。
このツールはブラウザに組み込まれたJavaScript(ECMAScript)の正規表現エンジンをそのまま使っています。ここで動いたパターンは、JavaScriptやTypeScriptのnew RegExp(...)や/パターン/フラグにそのまま入れられます。 PHPなどのPCRE、Python、Java、.NETにはそれぞれ方言があり、基本は共通でも細部が違います(後半の「他の言語との違い」を参照)。 処理はすべてお使いのブラウザ内で完結します。入力したパターンとテスト文字列は送信も保存もされません。それでも、実在の個人情報をテスト欄に貼る必要はなく、ダミーの文字列で十分です。
基本構文の早見表
| 表記 | 意味 | 例 |
|---|---|---|
. | 改行以外の任意の1文字(sフラグがあれば改行も含む) | a.c → abc、a1c |
\d \w \s | 数字 / 半角英数字とアンダースコア / 空白類 | \d\d → 12 |
[abc] [^abc] | リスト内の1文字 / リスト以外の1文字 | [A-Z] → 英大文字 |
* + ? | 0回以上 / 1回以上 / 0〜1回 | ab+ → ab、abbb |
a{2,3} | 2〜3回の繰り返し | \d{4} → ちょうど4桁の数字 |
^ $ | 文字列(mフラグがあれば各行)の先頭 / 末尾 | ^abc$ |
\b | 単語の境界(単語文字と非単語文字の間) | \bcat\b |
(…) (?:…) | キャプチャするグループ / しないグループ | (ab)+ |
a|b | または | cat|dog |
(?=…) (?!…) | 先読み(後ろに…がある / ない) | \d+(?=%) |
(?<=…) (?<!…) | 後読み(前に…がある / ない) | (?<!\d)\d{5}(?!\d) |
日本語で必ず知っておきたいのは、\wと\bが半角英数字とアンダースコアしか「単語文字」と見なさないことです。ひらがな・カタカナ・漢字は単語文字ではないので、\w+では日本語を拾えず、\bcat\bは「cat猫」の中でもマッチします。 日本語の文字を狙うときは、uフラグを付けてUnicodeプロパティで指定します。たとえばひらがなは\p{Script=Hiragana}+、漢字は\p{Script=Han}+です。
フラグ
- g(global): 最初の1件で止まらず、すべてのマッチを探します。置換でもgがなければ最初の1件だけが置き換わります。
- i(ignore case): 英字の大文字・小文字を区別しません。
- m(multiline):
^と$が、文字列全体ではなく各行の先頭と末尾にマッチします。行単位のチェックに必須です。 - s(dotAll):
.が改行にもマッチします。複数行にまたがるタグなどに使います。 - u(unicode): 文字をコードポイント単位で扱い、
\p{Script=Hiragana}+のようなプロパティ指定を使えるようにします。絵文字などは、uがないと2文字に数えられます(/^.$/は「😀」にマッチせず、/^.$/uはマッチします)。 - y(sticky):
lastIndexで指定した位置でだけ照合します。
新しいエンジンには、グループの位置情報を返すdと、拡張Unicodeモードのvもありますが、ブラウザが対応している場合に限ります。このツールは入力されたフラグをそのままブラウザに渡すため、非対応のフラグや重複したフラグはエラーとして表示されます。gなしでは最初の1件だけを表示し、exec()を1回呼んだ結果と同じ見え方にしています。
よく使うパターン(Node.jsで動作確認済み)
以下は上のプリセットボタンに入っており、例文が説明どおりにマッチする・除外されることを確認しています。
メールアドレス
\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b(フラグgi)は、alex@example.comとa.b+c@mail.co.ukにマッチし、トップレベルドメインのないbad@xや@no.comは除外します。 ただしメールアドレスの正式な規格(RFC 5322)はもっと複雑で、短いパターンで有効なアドレスをすべて通し、誤りをすべて見つけることはできません。簡易な一次チェックにとどめ、実在の確認は確認メールの送信で行うのが基本です。
携帯電話番号と郵便番号
\b0[789]0-?\d{4}-?\d{4}\bは、070・080・090から始まる11桁の番号を、ハイフンの有無を問わず拾います。例文では090-1234-5678と08012345678がマッチし、桁数が合わない090-123-45678や、050で始まるIP電話の050-1234-5678は除外されます。 郵便番号は\b\d{3}-\d{4}\bで、100-0001のような3桁-4桁の形式に合うものを探します(〒の記号は含まれません)。どちらも「形式」だけを見るもので、実際にその番号があるかどうかは分かりません。
日付(YYYY/MM/DD または YYYY-MM-DD)
\b(\d{4})[\/-](0?[1-9]|1[0-2])[\/-](0?[1-9]|[12]\d|3[01])\bは、区切りにスラッシュとハイフンの両方を許し、月を1〜12、日を1〜31に限定します。例文の2026/10/13と2026-1-5はマッチし、2026/13/01(13月)は除外されます。 ただし正規表現が見るのは形式だけなので、2月31日のような暦にない日付は通ってしまいます。実在する日付かどうかは、正規表現のあとに日付ライブラリなどで確認してください。
ひらがな・カタカナ・漢字
- ひらがな:
\p{Script=Hiragana}+(フラグgu)。「ひらがなとカタカナと漢字」から「ひらがなと」と「と」を拾います。 - カタカナ:
\p{Script_Extensions=Katakana}+。長音記号「ー」は、ひらがなにもカタカナにも使われるため、Script=KatakanaではなくScript_Extensionsで指定しないと「コーヒー」が「コ」と「ヒ」に分かれてしまいます。逆に、ひらがなの語に含まれる「ー」もマッチする点に注意してください。 - 漢字:
\p{Script=Han}+。「漢字々」の「々」も含めて拾います。句読点の「、」「。」は含まれません(Script_Extensions=Hanにすると含まれてしまいます)。
URL・IPv4・色コード
- URL:
https?:\/\/[^\s<>"']+は、空白・山かっこ・引用符の手前までを取ります。文末の句点やかっこが付いてくることがあるので後処理が必要です。 - IPv4: 各数字を0〜255に収まる選択肢の組み合わせで書いてあり、
192.168.0.1はマッチして256.1.1.1と1.2.3は除外されます。 - HEX色:
#(?:[0-9a-fA-F]{3}){1,2}\bは3桁または6桁だけを許可し、#fffと#C9A961はマッチ、#12345は除外されます。
貪欲と非貪欲(最短一致)
*、+、a{2,3}は、できるだけ長く取る貪欲(greedy)がデフォルトです。後ろに?を付けると、できるだけ短く取る非貪欲(lazy)になります。<b>一つ目</b> そして <b>二つ目</b>に対して、<b>.*<\/b>は最初の開始タグから最後の終了タグまでを1つのマッチにし、<b>.*?<\/b>は2つに分けて拾います。最後の2つのプリセットで、マッチ数が1個と2個に分かれるのを確かめてください。 より安全なのは、[^<]*のように「閉じる文字を除く」否定文字クラスを使う方法で、動作も予測しやすくなります。
ReDoS:正規表現が処理を止めてしまうとき
JavaScriptのエンジンはバックトラック方式で、うまくいかない経路を戻って別の経路を試します。繰り返しの中にさらに繰り返しがあるパターンでは、入力が長くなるにつれて試行回数が急増し、これをReDoS(正規表現によるサービス拒否)と呼びます。 典型例が^(a+)+$です。aが並んだ末尾にbがある文字列に対し、内側と外側のプラスにaをどう割り振るか、全部の組み合わせを試してから失敗します。Node.jsで測ったところ、aが24個で約0.1秒、26個で約0.4秒、1つ増えるごとにほぼ倍になりました(数値は環境によります)。40個なら実質終わりません。 同じ意図の^a+$は一瞬で終わります。このページで試してタブが固まった場合は、ブラウザの応答を待つか、タブを閉じてください。
- 繰り返しの中の繰り返し(
(a+)+、(.*)*)や、選択肢が重なる繰り返し((a|a)+、(a|aa)+)を避けます。 - ユーザー入力に正規表現を使うときは、先に長さを制限します。
.*の代わりに、具体的な文字クラスを使います。- ユーザーが指定したパターンを、そのままサーバー側で実行しないでください。
計算が100msを超えると、ステータス行に警告を出します。ただし実行中に止めることはできないため、疑わしいパターンはまず短い文字列で試してください。
グループ・名前付きグループ・置換
かっこで囲んだ部分はキャプチャグループになり、マッチ一覧に番号つきで表示されます。(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})のように名前を付ければ、番号ではなく名前で値を読めるので、パターンが長くなっても管理しやすくなります。 置換欄では$1(1番のグループ)、$&(マッチ全体)、$<名前>(名前付きグループ)が使えます。検算例として、日付のパターンに2026-10-13を入れ、置換を$3/$2/$1にすると13/10/2026になります。名前付きグループのプリセットも$<day>/$<month>/$<year>で同じ結果になります。 マッチに加わらなかった省略可能なグループは「(なし)」と表示されます。
つまずきやすい点
- gフラグ付きの正規表現でtest()を繰り返す: gがあると
lastIndexが残るため、同じオブジェクトにtest()を続けて呼ぶと結果が交互に変わります(「aa」に/a/gだとtrue、true、false)。毎回新しく作るか、lastIndexを0に戻してください。 - 空文字列のマッチ:
'abc'.match(/x*/g)は、各位置で空文字列が4つ返ります。このツールは空マッチを一覧には出しますが、ハイライトはしません。 - 文字列リテラルでのエスケープ: JavaScriptの文字列の中ではバックスラッシュを2つ重ねます(
"\\d")。このツールの入力欄では\dとそのまま書きます。 - 全角と半角: 全角の数字「123」は
\dにマッチしません。全角を扱うなら[0-9]のように範囲を指定します。
他の言語との違い
- JavaScriptには、PCREのインラインフラグ
(?i)、強欲な繰り返しa++、アトミックグループがありません。 - Pythonでは名前付きグループを
(?P<名前>…)と書きますが、JavaScriptは(?<名前>…)です。 - 言語によっては文字列の先頭・末尾に
\A、\zを使えますが、JavaScriptでは(mなしの)^と$を使います。 - 後読みは最新のブラウザで使えますが、古い環境に対応する必要がある場合は確認してください。
正規表現を使わないほうがよい場合
HTML、XML、JSONのような入れ子構造は、正規表現だけで正しく解釈することはできません。専用のパーサーを使ってください(JSONならJSONフォーマッターが適しています)。また、メールの受信箱が実在するか、日付が暦に存在するか、電話番号が使われているかといった意味の確認も正規表現の役割ではありません。 正規表現は形式のフィルターとして使い、意味の確認は別の処理に任せましょう。
よくある質問
キャプチャグループはどこで確認できますか?
確認したい部分をかっこで囲むと、マッチ一覧の各項目の下にグループ番号ごとの値が表示されます。名前付きグループは名前も一緒に表示されます。
パターンが間違っているとどうなりますか?
構文エラーがあると、ブラウザが返したエラーメッセージがステータス行に表示されます。かっこや角かっこの対応、特殊文字のエスケープ、繰り返す対象のない量指定子、フラグの誤りを確認してください。
gフラグを外すとなぜ1件しか出ないのですか?
gがないと、JavaScriptの正規表現は最初のマッチで止まります。すべてのマッチを探したり、すべてを置換したりするにはgを付けてください。
入力した文字列は外部に送信されますか?
いいえ。パターンとテスト文字列は、このページ上でブラウザ自身の正規表現エンジンが処理します。ツールがそれらを送信することも保存することもありません。
メールアドレスの正規表現で、有効かどうか完全に判定できますか?
いいえ。判定できるのは形式だけで、実在するかどうかは分かりません。確認メールの送信がもっとも確実で、正規表現は明らかなタイプミスを除く一次フィルターとして使うのが適切です。
関連ツール
- テキスト比較(diff)ツール - 置換の前後の違いを確認
- JSONフォーマッター - JSONは正規表現ではなくパーサーで
- テキスト大文字/小文字・ケース変換機 - 大文字小文字や命名規則の変換
- URLエンコーダー・デコーダー - URLの特殊文字を変換