バリデーション処理やログ解析でよく見かける、こんなコードに戸惑ったことはないでしょうか。

/^[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などの定番パターンはコピーして使い回せる
  • 複雑なパターンはテスターで動作確認しながら作るのが確実

まずはシンプルなパターンから試してみましょう。