バリデーション処理やログ解析でよく見かける、こんなコードに戸惑ったことはないでしょうか。
/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
これは「メールアドレスかどうか確認する」正規表現です。記号だらけで読みにくいですが、ルールさえ覚えれば自分でも書けるようになります。
この記事では正規表現の基本的な記号(メタ文字)の意味と、現場でよく使うパターン10選を具体例付きで紹介します。
正規表現とは?
正規表現(Regular Expression)とは、文字列のパターンを表す記法です。JavaScript・Python・PHP・Go・Javaなど、ほぼすべてのプログラミング言語で使えます。
主な用途は3つです。
- 検索・マッチ:文字列が特定のパターンに一致するか確認する(フォームバリデーション)
- 抽出:文章の中から電話番号やURLを取り出す
- 置換:特定のパターンに一致する文字列を別の文字列に置き換える
よく使うメタ文字一覧
| 記号 | 意味 | 例 |
|---|---|---|
| . | 任意の1文字(改行以外) | a.c → abc, aXc |
| * | 直前の文字を0回以上繰り返す | ab*c → ac, abc, abbc |
| + | 直前の文字を1回以上繰り返す | ab+c → abc, abbc(acは非マッチ) |
| ? | 直前の文字を0回または1回 | colou?r → color, colour |
| {n,m} | n回以上m回以下繰り返す | \d{3,4} → 123, 1234 |
| \d | 数字(0〜9) | \d+ → 42, 1234 |
| \w | 英数字またはアンダースコア | \w+ → hello_1 |
| \s | 空白文字(スペース・タブ・改行) | \s+ → " " |
| ^ | 行頭 | ^Hello → "Hello World"の先頭 |
| $ | 行末 | world$ → "Hello world"の末尾 |
| [abc] | a, b, cのいずれか1文字 | [aeiou] → 母音1文字 |
| [^abc] | a, b, c以外の1文字 | [^0-9] → 数字以外 |
| () | グループ化・キャプチャ | (abc)+ → abc, abcabc |
| \| | OR(どちらか) | cat|dog → cat または dog |
実際によく使うパターン10選
① メールアドレスのバリデーション
/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
② 日本の電話番号(ハイフンあり)
/^0\d{1,4}-\d{1,4}-\d{4}$/
// 例:03-1234-5678、090-1234-5678
③ 郵便番号(〒)
/^\d{3}-\d{4}$/
// 例:123-4567
④ URLのマッチ
/https?:\/\/[^\s]+/ // 例:https://example.com/path?q=test
⑤ YYYY-MM-DD形式の日付
/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/
// 例:2024-03-15
⑥ 半角英数字のみ(パスワードなど)
/^[a-zA-Z0-9]+$/
⑦ 先頭・末尾の空白を取り除く(trim代替)
/^\s+|\s+$/g
⑧ HTMLタグの除去
/<[^>]*>/g
⑨ 16進数カラーコード
/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/
// 例:#ff6600、#fff
⑩ IPv4アドレス
/^(\d{1,3}\.){3}\d{1,3}$/
// 例:192.168.1.1
JavaScriptでの使い方
// テスト(マッチするか確認)
/^[a-zA-Z0-9]+$/.test("hello123") // true
// 抽出(マッチした文字列を取り出す)
"今日は2024-03-15です".match(/\d{4}-\d{2}-\d{2}/)
// ["2024-03-15"]
// 置換
"Hello World".replace(/\s+/g, "_")
// "Hello_World"
よくある質問(FAQ)
- 正規表現は処理が遅いですか?
- パターンの書き方によって大きく変わります。単純なパターンは高速ですが、
(a+)+のような「カタストロフィックバックトラッキング」が発生するパターンは、入力によっては極端に遅くなります。正規表現テスターで実際のデータを試して確認するのが有効です。ユーザー入力にそのまま使う場合はタイムアウト設定も検討してください。 - greedyとlazyの違いは何ですか?
- デフォルトの量指定子(
*や+)は「できるだけ長くマッチしようとする(greedy)」動作をします。*?や+?のように?をつけると「できるだけ短くマッチしようとする(lazy)」動作になります。例えば<.*>は<a>テスト</a>全体にマッチしますが、<.*?>は<a>だけにマッチします。 - 正規表現をどこで練習できますか?
- このサイトの正規表現テスターを使うと、パターンを入力しながらリアルタイムでマッチ結果を確認できます。実際の文字列に当ててみながら覚えるのが一番の近道です。また、regex101.com はパターンを視覚的に解説してくれるため、複雑なパターンの理解にも役立ちます。
まとめ
- 正規表現は文字列のパターンを表す記法で、ほぼすべての言語で使える
\d(数字)・\w(英数字)・+(1回以上)などの基本記号を覚えれば多くのケースに対応できる- メール・電話番号・URLなどの定番パターンはコピーして使い回せる
- 複雑なパターンはテスターで動作確認しながら作るのが確実
まずはシンプルなパターンから試してみましょう。
- 正規表現テスター — パターンをリアルタイムで検証・確認できる
- テキスト差分チェッカー — テキストの変更前後を比較する
- 文字数カウンター — 入力文字列の文字数・単語数を確認する