目次
はじめに:正規表現ってなに?
プログラムで文字列を扱うとき、「ある文字列が特定の形式かどうか」を調べたいことがあります。
たとえば:
- 入力された郵便番号が正しいか?
- メールアドレスの形になっているか?
- 文の中に「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)もスラスラ読めるようになります。

