Tips
正規表現チートシート|コピペで使える実務パターン集
2026-03-09
結論:実務で使うのはこの7パターン
正規表現を「理解する」必要はない。 「コピペして動く」が正義。
| やりたいこと | パターン |
|---|---|
| メールアドレス | ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ |
| 電話番号(日本) | ^0\d{1,4}-?\d{1,4}-?\d{3,4}$ |
| URL | ^https?:\/\/[\w\-]+(\.[\w\-]+)+[\/\w\-.,@?^=%&:~+#]*$ |
| 郵便番号 | ^\d{3}-?\d{4}$ |
| 半角英数のみ | ^[a-zA-Z0-9]+$ |
| 日付(YYYY-MM-DD) | ^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$ |
| HTMLタグ除去 | <[^>]*> |
この表をブックマークすれば、毎回ググらなくて済む。
基本記法:これだけ覚える
文字の指定
| 記法 | 意味 | 例 |
|---|---|---|
. | 任意の1文字 | a.c → abc, a1c, a-c |
\d | 数字(0-9) | \d{3} → 123, 456 |
\w | 英数字とアンダースコア | \w+ → hello_123 |
\s | 空白文字 | \s+ → スペース、タブ |
[abc] | a, b, c のいずれか | [aeiou] → 母音 |
[^abc] | a, b, c 以外 | [^0-9] → 数字以外 |
量指定子
| 記法 | 意味 | 例 |
|---|---|---|
* | 0回以上 | ab*c → ac, abc, abbc |
+ | 1回以上 | ab+c → abc, abbc(ac は不一致) |
? | 0回または1回 | colou?r → color, colour |
{n} | ちょうどn回 | \d{4} → 2026 |
{n,m} | n回以上m回以下 | \d{2,4} → 12, 123, 1234 |
位置指定
| 記法 | 意味 |
|---|---|
^ | 先頭 |
$ | 末尾 |
\b | 単語の境界 |
// 「先頭から末尾まで全体が一致」を確認するとき
/^\d{3}-\d{4}$/.test("123-4567"); // true
/^\d{3}-\d{4}$/.test("〒123-4567"); // false(先頭に〒)
実務パターン詳細
メールアドレス
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
emailRegex.test("user@example.com"); // true
emailRegex.test("user@example"); // false
emailRegex.test("user@.com"); // false
⚠️ RFC 5322 準拠の完全なバリデーションは正規表現では不可能。フォームの入力チェック用途なら上記で十分。 厳密な検証はサーバーサイドで確認メールを送る。
電話番号(日本)
const phoneRegex = /^0\d{1,4}-?\d{1,4}-?\d{3,4}$/;
phoneRegex.test("03-1234-5678"); // true
phoneRegex.test("090-1234-5678"); // true
phoneRegex.test("09012345678"); // true(ハイフンなし)
phoneRegex.test("1234-5678"); // false(先頭0なし)
URL
const urlRegex = /^https?:\/\/[\w\-]+(\.[\w\-]+)+[\/\w\-.,@?^=%&:~+#]*$/;
urlRegex.test("https://example.com"); // true
urlRegex.test("http://example.com/path?q=1"); // true
urlRegex.test("ftp://example.com"); // false(httpのみ)
郵便番号
const zipRegex = /^\d{3}-?\d{4}$/;
zipRegex.test("123-4567"); // true
zipRegex.test("1234567"); // true
zipRegex.test("123-456"); // false
JavaScript での使い方
test:一致するか確認
const regex = /^\d+$/;
regex.test("123"); // true
regex.test("abc"); // false
match:一致した部分を取得
const text = "電話番号は03-1234-5678です";
const matches = text.match(/\d{2,4}-\d{3,4}-\d{3,4}/);
// matches[0] → "03-1234-5678"
replace:置換
// HTMLタグを除去
const html = "<p>テキスト</p>";
const plain = html.replace(/<[^>]*>/g, "");
// plain → "テキスト"
// 電話番号のハイフンを除去
"03-1234-5678".replace(/-/g, "");
// → "0312345678"
matchAll:複数一致を取得
const text = "price: $100, tax: $10";
const matches = [...text.matchAll(/\$(\d+)/g)];
// matches[0][1] → "100"
// matches[1][1] → "10"
よくあるミス
1. エスケープ忘れ
// ✗ ドットが「任意の1文字」として扱われる
/example.com/
// ✓ ドットをリテラルとして扱う
/example\.com/
エスケープが必要な文字:. * + ? ^ $ { } [ ] ( ) | \ /
2. 貪欲マッチの罠
const html = "<b>太字</b>と<b>強調</b>";
// ✗ 貪欲:最長一致
html.match(/<b>.*<\/b>/);
// → "<b>太字</b>と<b>強調</b>"
// ✓ 非貪欲:最短一致(?を追加)
html.match(/<b>.*?<\/b>/);
// → "<b>太字</b>"
3. グローバルフラグの付け忘れ
// ✗ 最初の1つだけ置換
"aaa".replace(/a/, "b"); // → "baa"
// ✓ 全部置換
"aaa".replace(/a/g, "b"); // → "bbb"
4. 全角文字の扱い
// ✗ \w は全角文字に一致しない
/^\w+$/.test("テスト"); // false
// ✓ Unicode対応
/^[\p{L}\p{N}]+$/u.test("テスト"); // true
日本語を含む場合は \p{L}(Unicode文字)+ u フラグを使う。
フラグ一覧
| フラグ | 意味 | 使う場面 |
|---|---|---|
g | 全体検索 | replace で全箇所置換 |
i | 大文字小文字無視 | Hello も hello も一致させたい |
m | 複数行モード | ^ $ が各行に適用 |
s | dotAll | . が改行にも一致 |
u | Unicode | 日本語、絵文字を扱う |
// 大文字小文字を無視して検索
/hello/i.test("Hello"); // true
// 複数行で各行の先頭を検索
"line1\nline2".match(/^line/gm);
// → ["line", "line"]
入力バリデーションの判断基準
| 項目 | 正規表現でやるべきか |
|---|---|
| 形式チェック(桁数、文字種) | ✓ やるべき |
| メールの存在確認 | ✗ 確認メールを送る |
| 日付の妥当性(2月30日など) | ✗ Date オブジェクトで検証 |
| パスワード強度 | △ 長さ・文字種のみ正規表現、総合判断はロジックで |
| HTML のサニタイズ | ✗ DOMParser や専用ライブラリを使う |
正規表現は「形式が合っているか」の確認だけ。 「正しいか」の検証はロジックで。
まとめ
| やりたいこと | 方法 |
|---|---|
| 形式チェック | test() |
| 部分抽出 | match() / matchAll() |
| 置換 | replace() |
| 全箇所対象 | g フラグ |
| 日本語対応 | u フラグ + \p{L} |
正規表現は覚えなくていい。このページをブックマークして、必要なときにコピペする。
関連記事
- JavaScript デバッグの基本 — console.log 以外のデバッグ手法
- JSON 構文エラーの直し方 — よくある JSON のミスと対処
- URL エンコード完全ガイド — 特殊文字のエンコード処理