目次
はじめに:正規表現ってなに?
プログラムで文字列を扱うとき、「ある文字列が特定の形式かどうか」を調べたいことがあります。
たとえば:
- 入力された郵便番号が正しいか?
 - メールアドレスの形になっているか?
 - 文の中に「http」が含まれているか?
 
こうした“文字のルール”を表すのが正規表現(Regular Expression)です。
JavaScriptでは、
const regex = /パターン/;
という形で簡単に書けます。
1. 郵便番号の例で正規表現を見てみよう
最も身近な例のひとつが、日本の郵便番号です。
たとえば「123-4567」という形の番号をチェックしたい場合、次のように書けます。
const postal = /^\d{3}-\d{4}$/;
console.log(postal.test("123-4567")); // ✅ true
console.log(postal.test("12-34567")); // ❌ false
これだけで「文字列が郵便番号形式かどうか」を判定できます。
ではこの /^\d{3}-\d{4}$/ を分解して見てみましょう。
2. /^\d{3}-\d{4}$/ の意味をひとつずつ理解する
| 部分 | 意味 | 説明 | 
|---|---|---|
/ / | 正規表現リテラルを囲む記号 | JavaScriptでは /.../ の形で表す | 
^ | 文字列の先頭 | 「これが最初に来なければいけない」 | 
\d | 数字1桁(0〜9) | “digit” の略 | 
{3} | 直前を3回繰り返す | \d{3} → 数字3桁連続 | 
- | ハイフンそのもの | 特別な意味はなし(文字) | 
\d{4} | 数字4桁 | 4桁連続の数字を意味 | 
$ | 文字列の末尾 | 「ここで終わる」ことを指定 | 
🔍 つまり:
「先頭から3桁の数字、ハイフン、4桁の数字で終わる文字列」だけがOK。
例:
✅ 123-4567 → OK
❌ 住所123-4567 → NG(先頭に余計な文字)
❌ 123-4567abc → NG(末尾に文字がある)
3. 実際にコードで試してみよう
const regex = /^\d{3}-\d{4}$/;
console.log(regex.test("123-4567"));   // ✅ true
console.log(regex.test("123-4567")); // ❌ 全角数字はNG
console.log(regex.test("1234567"));    // ❌ ハイフンなし
console.log(regex.test("A23-4567"));   // ❌ 数字以外が含まれる
console.log(regex.test("123-4567a"));  // ❌ 末尾に文字
💡 ^ と $ をつけることで、「完全一致」をチェックできるようになります。
もしこれを外すと、文章中の一部に「123-4567」が含まれているだけでも true になってしまいます。
4. 半角・全角の両方を許す柔軟な書き方
日本語のフォームでは「全角数字」で入力されることもよくあります。
その場合は、全角の数字範囲 [0-9] も加えると対応できます。
const postal = /^[0-90-9]{3}-[0-90-9]{4}$/;
console.log(postal.test("123-4567")); // ✅ true
ここでは [0-90-9] が「半角0〜9 または 全角0〜9」のどちらかを許す、という意味になります。
5. フラグ(オプション)を使うとどうなる?
正規表現には検索モードを変えるための“フラグ”があります。
たとえば /abc/i の i は「大文字小文字を区別しない」設定です。
| フラグ | 説明 | 例 | 
|---|---|---|
g | グローバル検索(すべてヒット) | /a/g | 
i | 大文字・小文字を区別しない | /abc/i | 
m | 複数行モード(^と$が行ごとに働く) | /^abc/m | 
s | 改行も.でマッチする | /a.b/s | 
郵便番号のように「完全一致」でチェックしたい場合は、フラグは不要です。
6. 正規表現でよく出てくる記号の意味まとめ
| 記号 | 意味 | 例 | マッチする文字列 | 
|---|---|---|---|
. | 任意の1文字(改行除く) | /a.b/ | acb, a_b | 
[] | 指定した文字のいずれか | /[abc]/ | a, b, c | 
[^] | 指定以外の文字 | /[^0-9]/ | 数字以外 | 
\d | 数字 | /\d+/ | 1, 22, 333 | 
\w | 英数字または _ | /\w+/ | abc_123 | 
\s | 空白・タブなど | /\s+/ | スペースなど | 
+ | 1回以上の繰り返し | /a+/ | a, aa, aaa | 
* | 0回以上 | /a*/ | "", a, aaa | 
? | 0または1回 | /colou?r/ | color, colour | 
{n} | n回繰り返し | /\d{3}/ | 123 | 
{n,m} | n〜m回繰り返し | /\d{2,4}/ | 12, 123, 1234 | 
| ` | ` | OR条件 | `/cat | 
() | グループ化 | /(ab)+/ | ab, abab | 
7. 実務でよく使う正規表現パターン集
| 用途 | 正規表現 | 説明 | 
|---|---|---|
| 郵便番号 | /^\d{3}-\d{4}$/ | 3桁-4桁 | 
| 電話番号 | /^0\d{1,4}-\d{1,4}-\d{4}$/ | 一般的な電話番号 | 
| メールアドレス | /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/i | メール形式 | 
| URL | /^https?:\/\/[^\s]+$/ | httpまたはhttpsで始まる | 
| 日付 | /^\d{4}-\d{2}-\d{2}$/ | YYYY-MM-DD 形式 | 
8. よくある間違いと回避法
| ミス | 結果 | 改善策 | 
|---|---|---|
^ と $ を忘れる | 部分一致してしまう | 常に「完全一致」を意識する | 
\d で全角数字も通ると思っている | 全角はマッチしない | [0-90-9] を使う | 
| パターンを複雑にしすぎる | 読めない・直せない | 段階的に組み立てる | 
test() ではなく match() を使って混乱 | 結果が違う | test() は真偽、match() は配列 | 
9. さらに使いこなすテクニック
🔸 名前付きキャプチャ(ES2020〜)
const regex = /(?<first>\d{3})-(?<second>\d{4})/;
const match = "123-4567".match(regex);
console.log(match.groups.first);  // 123
console.log(match.groups.second); // 4567
🔸 前後読み(Lookahead / Lookbehind)
console.log("300円".match(/\d+(?=円)/)); // ["300"]
console.log("#タグ".match(/(?<=#).+/));   // ["タグ"]
10. まとめ:読めるようになると一気に世界が広がる
最初は「記号だらけで難しそう」に見える正規表現ですが、
意味を分解して理解すれば、まるで文法のように読めるようになります。
郵便番号 /^\d{3}-\d{4}$/ はその最初の一歩。
ここを理解すれば、他のパターン(電話・日付・メール・URL)もスラスラ読めるようになります。

	