正規表現とは
たとえば「ハイフンあり・なしを問わず日本の電話番号すべてにマッチしたい」という場合、単純な文字列検索では難しいですが、正規表現を使えば 0\d{1,4}-?\d{1,4}-?\d{4} のような1行のパターンで表現できます。
本ガイドでは JavaScript(ECMAScript 2023)の正規表現仕様を基準として解説します。PythonやPHPでも基本的なメタ文字の意味は共通ですが、一部の構文(名前付きキャプチャ、Unicode プロパティエスケープなど)はエンジンによって異なる点に注意してください。
正規表現が使われる主な場面
- フォームバリデーション — メールアドレス・電話番号・郵便番号の形式チェック
- 文字列の検索・抽出 — ログファイルから特定パターンの行を取得
- 文字列の置換 — HTMLタグの除去、特定フォーマットへの変換
- テキスト解析 — CSVパース、マークアップ処理
基本的な記法
基本的な記法とは、正規表現を構成する最小単位のルールであり、「メタ文字」「量指定子」「文字クラス」「アンカー」の4カテゴリに分類されます。
メタ文字(特殊記号)
メタ文字は正規表現エンジンが特別な意味として解釈する記号です。リテラルとして使う場合はバックスラッシュ(\)でエスケープします。
| メタ文字 | 意味 | 例 |
|---|---|---|
. | 任意の1文字(改行を除く) | a.c → "abc", "a1c" |
\d | 数字(0〜9) | \d\d → "42" |
\D | 数字以外 | \D+ → "abc" |
\w | 英数字・アンダースコア | \w+ → "hello_1" |
\W | \w 以外 | \W → " ", "@" |
\s | 空白文字(スペース・タブ・改行) | \s+ → " " |
\S | 空白以外 | \S+ → "word" |
\n | 改行 | 行末の改行にマッチ |
\t | タブ | タブ文字にマッチ |
量指定子(繰り返し)
量指定子は直前のパターンが何回繰り返すかを指定します。
| 記号 | 意味 | 例 |
|---|---|---|
* | 0回以上 | ab* → "a", "ab", "abbb" |
+ | 1回以上 | ab+ → "ab", "abbb"("a"は不可) |
? | 0回または1回 | colou?r → "color", "colour" |
{n} | ちょうどn回 | \d{4} → "2026" |
{n,} | n回以上 | \d{3,} → "123", "12345" |
{n,m} | n〜m回 | \d{2,4} → "12", "1234" |
文字クラス([])
角括弧で囲んだ文字のいずれか1文字にマッチします。^ を先頭に置くと否定になります。
[abc] # a, b, c のどれか1文字
[a-z] # 小文字アルファベット
[A-Za-z0-9] # 英数字
[^0-9] # 数字以外の1文字
アンカー(位置指定)
| 記号 | 意味 |
|---|---|
^ | 文字列(行)の先頭 |
$ | 文字列(行)の末尾 |
\b | 単語の境界 |
\B | 単語境界以外 |
グループと選択
(abc) # キャプチャグループ:abc にマッチし、後から参照可能
(?:abc) # 非キャプチャグループ:グループ化のみ、結果は保存しない
a|b # 選択:a または b
よく使うパターン20選
よく使うパターンとは、実務で繰り返し登場するバリデーションや抽出に使える正規表現のテンプレートです。以下のパターンはすべて JavaScript の RegExp で動作確認済みです。
| # | 用途 | パターン | マッチ例 |
|---|---|---|---|
| 1 | メールアドレス | ^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$ |
[email protected] |
| 2 | 日本の電話番号(ハイフンあり) | 0\d{1,4}-\d{1,4}-\d{4} |
03-1234-5678 |
| 3 | 日本の電話番号(ハイフンあり・なし両対応) | 0\d{1,4}-?\d{1,4}-?\d{4} |
0312345678, 03-1234-5678 |
| 4 | 携帯電話番号 | 0[789]0-?\d{4}-?\d{4} |
090-1234-5678, 08012345678 |
| 5 | 郵便番号(ハイフンあり) | \d{3}-\d{4} |
100-0001 |
| 6 | 郵便番号(ハイフンあり・なし両対応) | \d{3}-?\d{4} |
1000001, 100-0001 |
| 7 | URL(http/https) | https?://[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:/~+#]*[\w\-@?^=%&/~+#])? |
https://example.com/path?q=1 |
| 8 | 日付(YYYY-MM-DD) | \d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) |
2026-04-13 |
| 9 | 日付(YYYY/MM/DD) | \d{4}\/(0[1-9]|1[0-2])\/(0[1-9]|[12]\d|3[01]) |
2026/04/13 |
| 10 | 時刻(HH:MM) | ([01]\d|2[0-3]):[0-5]\d |
09:30, 23:59 |
| 11 | IPアドレス(IPv4) | ((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?) |
192.168.0.1 |
| 12 | 半角英数字のみ | ^[A-Za-z0-9]+$ |
hello123 |
| 13 | 数字のみ(整数) | ^\d+$ |
12345 |
| 14 | 全角カタカナ | ^[\u30A0-\u30FF]+$ |
アイウエオ |
| 15 | ひらがな | ^[\u3041-\u3096]+$ |
あいうえお |
| 16 | HTMLタグ(除去用) | <[^>]+> |
<p class="x">, </div> |
| 17 | 空白行(除去用) | ^\s*$ |
空白のみの行 |
| 18 | クレジットカード番号(基本形) | \d{4}[- ]?\d{4}[- ]?\d{4}[- ]?\d{4} |
1234-5678-9012-3456 |
| 19 | 16進数カラーコード | #([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}) |
#FF5733, #f00 |
| 20 | Windowsファイルパス | [A-Za-z]:\\([\w\s\-\.]+\\)*[\w\s\-\.]* |
C:\Users\name\file.txt |
上記のパターンはすべて下記の正規表現テストツールに貼り付けてすぐに動作確認できます。
正規表現テストツールの使い方
正規表現テストツールとは、パターンと文字列を入力するだけでマッチ箇所をリアルタイムでハイライト表示し、キャプチャグループの内容まで確認できる無料のオンラインツールです。
ステップ1:パターンを入力する
正規表現テストツールを開き、「パターン」欄に検証したい正規表現を入力します。スラッシュ(/)で囲む必要はありません。たとえばメールアドレスを確認したい場合は以下を貼り付けます。
^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$
ステップ2:フラグを選択する
必要に応じてフラグを選択します。
- g(グローバル) — テキスト全体から全マッチを検索します。デフォルトでオン。
- i(大文字小文字無視) —
ABCとabcを同一視します。 - m(複数行) —
^と$が各行の先頭・末尾に対応します。
ステップ3:テスト文字列を入力して結果を確認する
下のテキストエリアに検証したい文字列を入力または貼り付けます。マッチした箇所が青くハイライト表示され、マッチ数・キャプチャグループ数が即座に表示されます。パターンに誤りがある場合はエラーメッセージが表示されるので、その都度修正してください。
ステップ4:キャプチャグループを確認する
グループ ( ) を含むパターンを使った場合、「キャプチャグループ」エリアにマッチごとの各グループの値が表示されます。たとえば日付パターン (\d{4})-(0[1-9]|1[0-2])-(\d{2}) であれば、グループ1が年、グループ2が月、グループ3が日として表示されます。
ステップ5:実践テクニックを応用する
パターンが期待通り動作することを確認したら、実践で役立つテクニック セクションで紹介する「後方参照」「非貪欲マッチ」「先読み/後読み」などの応用記法を組み合わせて、より複雑な検索・抽出パターンを設計できます。
実践で役立つテクニック
実践で役立つテクニックとは、基本記法を組み合わせてより柔軟なパターンを作るための応用知識です。ここでは現場でよく使われる4つのテクニックを解説します。
キャプチャグループと後方参照
( ) で囲んだ部分はキャプチャグループとして保存され、$1、$2 などで参照できます。文字列置換で威力を発揮します。
// YYYY-MM-DD を MM/DD/YYYY に変換
const result = '2026-04-13'.replace(/(\d{4})-(\d{2})-(\d{2})/, '$2/$3/$1');
// result: "04/13/2026"
非キャプチャグループ (?:)
グループ化だけしてキャプチャを不要にする場合は (?:) を使います。キャプチャグループ数が増えて管理が煩雑になるのを防ぎ、わずかに処理が高速化します。
// (?:https?://) は「http://」か「https://」のグループ化のみ、保存しない
/(?:https?:\/\/)[\w\-]+(\.[\w\-]+)+/
先読み(Lookahead)と後読み(Lookbehind)
先読み・後読みは「その位置の前後に何があるか」を条件にするゼロ幅アサーションです。マッチした文字列自体には含まれません。
// 先読み:数字の後に「円」が続く場合のみ数字にマッチ
/\d+(?=円)/ → "1000円" の "1000" にマッチ
// 否定先読み:「円」が続かない数字
/\d+(?!円)/
// 後読み(ES2018+):「¥」の後に続く数字
/(?<=¥)\d+/
非貪欲マッチ(Lazy Matching)
量指定子のデフォルトは「貪欲(greedy)」で、できるだけ長い文字列にマッチします。? を付けることで「非貪欲(lazy)」になり、できるだけ短い文字列にマッチします。HTMLタグの抽出など、区切りが明確な場合に特に有効です。
// 貪欲:<b>太字</b>と<i>斜体</i> → <b>〜</i> 全体にマッチ
/<.+>/
// 非貪欲:<b> と </b> を個別にマッチ
/<.+?>/
名前付きキャプチャグループ(ES2018+)
(?<name>) で名前を付けると、match.groups.name で取得でき、可読性が上がります。
const re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const m = '2026-04-13'.match(re);
console.log(m.groups.year); // "2026"
console.log(m.groups.month); // "04"