正規表現って何?
正規表現は「文字列のパターンを探すための記号」です。
例えば「メールアドレスを探したい」「電話番号が正しい形式かチェックしたい」というときに使います。難しそうですが、基本を覚えれば意外と簡単です!
本記事の内容は主要な正規表現エンジン(JavaScript、Python、PHPなど)で共通して使える基本構文を基にしていますが、実装や設定(例: 改行を含むか、Unicode対応かなど)によって動作が異なる場合があります。
【超基本】まずこれだけ覚えよう!
1. . (ドット) = 「なんでもいいから1文字」
パターン: c.t
マッチ: cat, cot, c9t, c@t など
説明: 「c」と「t」の間に何か1文字あればOK
使用例
パターン: 20..年
マッチ: 2023年, 2024年, 20XX年
2. * (アスタリスク) = 「0回以上の繰り返し」
パターン: ca*t
マッチ: ct, cat, caat, caaaat
説明: 「a」が0個でも100個でもOK
覚え方 「*」は「何個でもいいよ(0個でもOK)」
3. + (プラス) = 「1回以上の繰り返し」
パターン: ca+t
マッチ: cat, caat, caaaat
マッチしない: ct (aが0個なのでダメ)
説明: 「a」が最低1個は必要
*との違い
-
*→ 0個でもOK -
+→ 最低1個は必要
使用例
パターン: \d+
マッチ: 1, 123, 999999 (1桁以上の数字)
4. ? (疑問符) = 「0回か1回だけ」
パターン: colou?r
マッチ: color, colour
説明: 「u」があってもなくてもOK
使用例
パターン: https?://
マッチ: http://, https://
上記の場合、httpsのsはあっても無くてもどっちでもOKという意味になります。
【重要】文字の範囲指定
5. [] (角カッコ) = 「この中のどれか1文字」
[abc] → a, b, c のどれか
[0-9] → 0から9のどれか(数字1桁)
[a-z] → aからzのどれか(小文字1文字)
[A-Za-z] → 大文字小文字のアルファベット1文字
ハイフンの意味 [0-9]は「0,1,2,3,4,5,6,7,8,9」の省略形
使用例
[0-9][0-9][0-9] → 123, 456 (3桁の数字)
[あ-ん]+ → あいうえお, ひらがな (ひらがなの連続)
6. [^] = 「この中 "以外" の1文字」
[^0-9] → 数字"以外"の1文字
[^a-z] → 小文字アルファベット"以外"の1文字
注意 角カッコの中の最初に^を書くと「〜以外」の意味になります
【便利】ショートカット記号
毎回[0-9]と書くのは面倒なので、省略形があります。
| 記号 | 意味 | 同じ意味 |
|---|---|---|
\d |
数字1文字 | [0-9] |
\D |
数字以外1文字 | [^0-9] |
\w |
英数字とアンダースコア | [A-Za-z0-9_] |
\W |
英数字とアンダースコア以外 | [^A-Za-z0-9_] |
\s |
空白文字(スペース、タブなど) | |
\S |
空白文字以外 |
覚え方 小文字は「〜を表す」、大文字は「〜以外」
使用例
\d{3}-\d{4} → 123-4567 (郵便番号っぽい並びを探すときとかに使う)
\w+@\w+ → user@example (メアドっぽい並びを探す)
【重要】繰り返し回数の指定
7. {} (波カッコ) = 「繰り返し回数を指定」
a{3} → aaa (ちょうど3回)
a{2,5} → aa, aaa, aaaa, aaaaa (2〜5回)
a{3,} → aaa, aaaa, aaaaa... (3回以上、上限なし)
使用例
\d{3}-\d{4}-\d{4} → 090-1234-5678 (電話番号)
[a-z]{5,10} → apple, banana (5〜10文字の英単語)
【重要】位置の指定
8. ^ と $ = 「先頭」と「末尾」
^hello → "hello world"の hello にマッチ(先頭のみ)
"say hello"の hello にはマッチしない
world$ → "hello world"の world にマッチ(末尾のみ)
"world peace"の world にはマッチしない
重要な使い方
^\d+$ → 文字列全体が数字だけで構成されてる場合にマッチ
"123"にマッチ、"abc123"にマッチしない
^と$を両方使うと 「完全一致」 になります!
【便利】グループ化と選択
9. () (丸カッコ) = 「グループ化」
(abc)+ → abc, abcabc, abcabcabc
説明: 「abc」というまとまりを繰り返す
グループ化しないとこうなる↓
abc+ → abc, abcc, abccc
説明: cだけが繰り返される
10. | (パイプ) = 「または」
cat|dog → cat または dog
(月|火|水)曜日 → 月曜日, 火曜日, 水曜日
【注意】エスケープ
正規表現で特別な意味を持つ文字を、普通の文字として使うときは前に\をつけます。
\. → ピリオド「.」そのもの
\* → アスタリスク「*」そのもの
\$ → ドル記号「$」そのもの
エスケープが必要な文字
. * + ? ^ $ { } [ ] ( ) | \
よくある例
example\.com → example.com にマッチ
(エスケープしないとexampleXcomなどもマッチしてしまう)
(これは正規表現の一部じゃなくて、ただの文字ですよ~ということを認識させるために、
文字として扱いたい記号の前には必ず「\」を入れましょう!)
【実践】段階的に学ぶ例
例1: メールアドレス
ステップ1 基本
\w+@\w+ → user@example
ステップ2 ドメイン追加
\w+@\w+\.\w+ → user@example.com
ステップ3 より厳密に
[a-zA-Z0-9._+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
→ user.name+tag@example.co.jp
例2: 電話番号
ステップ1 ハイフンあり
\d{3}-\d{4}-\d{4} → 090-1234-5678
ステップ2 ハイフン省略可
\d{3}-?\d{4}-?\d{4} → 09012345678 もOK
例3: 日付
ステップ1 基本形
\d{4}-\d{2}-\d{2} → 2024-12-25
ステップ2 スラッシュも対応
\d{4}[-/]\d{2}[-/]\d{2} → 2024/12/25 もOK
【応用】貪欲マッチと非貪欲マッチ
貪欲マッチ(デフォルト)
文字列: <div>内容1</div><div>内容2</div>
パターン: <div>.*</div>
結果: 全体がマッチしてしまう
*や+は「できるだけ多く」マッチしようとします。
非貪欲マッチ(?を追加)
文字列: <div>内容1</div><div>内容2</div>
パターン: <div>.*?</div>
結果: 個別にマッチする
*?や+?は「できるだけ少なく」マッチします。
よく使うパターン集
数字のみ: ^\d+$
英字のみ: ^[A-Za-z]+$
英数字のみ: ^[A-Za-z0-9]+$
電話番号: \d{2,4}-?\d{2,4}-?\d{4}
郵便番号: \d{3}-?\d{4}
メール: [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
日付(YYYY-MM-DD): \d{4}-\d{2}-\d{2}
日付(YYYY/MM/DD): \d{4}/\d{2}/\d{2}
時刻(HH:MM): \d{2}:\d{2}
URL: https?://[\w\-\.]+\.[a-z]{2,}
動作確認で便利なツール
regex101.com (超おすすめ!)
- リアルタイムでマッチ結果が見える
- どの部分がマッチしているか色付きで表示
- 各記号の意味も表示される
使い方
- regex101.comにアクセス
- 上の欄に正規表現を入力
- 下の欄にテストしたい文字列を入力
- 結果が右上に表示される
まとめ
-
.→ 何か1文字 -
+→ 1回以上繰り返し -
[0-9]→ 数字1文字 (または\d) -
{3}→ ちょうど3回 -
^と$→ 先頭と末尾
この5つを覚えれば、基本的なパターンは書けます!
