結論:正規表現の「よく使うパターン」は、文字クラス([ ])・量指定子(* + ? {n,m})・アンカー(^ $ \b)・グループ(( ) |)という少数の部品の組み合わせでできています。 丸暗記するより、この部品の意味を1つずつブラウザで動かして確認したほうが、結果的に早く「自分で組み立てられる」ようになります。
まずは動くパターン集(コピペしてOK)
先に、実務でそのまま使える定番パターンを並べます。いずれも「文字列全体がその形かどうか」を調べる想定で ^ と $ で囲んであります。
半角数字のみ: ^[0-9]+$
郵便番号(日本): ^\d{3}-\d{4}$
時刻(HH:MM): ^([01]\d|2[0-3]):[0-5]\d$
年月日: ^\d{4}-\d{2}-\d{2}$
英数字のID: ^[A-Za-z0-9_]{3,16}$
ざっくりメール: ^[\w.+-]+@[\w-]+\.[\w.-]+$
ざっくりURL: ^https?://[\w./?%&=-]+$
全角ひらがな: ^[ぁ-ん]+$
これらは Become-Coder の regex-17: 定番パターン集 ― そのまま使えるレシピ にまとまっているレシピです。このレッスンはブラウザ上でパターンとテスト文字列を書き換えながらマッチ結果をその場で確認できる mode: browser の実行レッスンなので、まずは上のパターンをそのまま貼り付けて動かしてみてください。インストールも会員登録も不要です。
なお、メールアドレスやURLを「完全に正しく」検証しようとすると正規表現は非常に複雑になり、かえって実用的ではありません。実務では「明らかにおかしい入力を弾く」程度のざっくりしたパターンで十分なことが多く、最終的な正しさは実際に送信・アクセスして確かめるのが定石です。この考え方も regex-17 の中で解説されています。
メールアドレスの正規表現
上のレシピの ^[\w.+-]+@[\w-]+\.[\w.-]+$ を分解すると、次のような部品でできています。
[\w.+-]+…@より前のユーザー名部分。英数字・アンダースコア・.+-が1文字以上@… そのままの記号[\w-]+… ドメイン名の一部(exampleの部分)\.[\w.-]+….に続けてcomやco.jpのようなトップレベルドメイン
\w(英数字とアンダースコア)や +(1回以上の繰り返し)の意味がまだあいまいな場合は、いきなりこの複雑なパターンから覚えようとせず、部品から順に確認するのがおすすめです。
- regex-06: 定義済み文字クラス ― \d \w \s の省略記法 —
\wが具体的に何にマッチするかをブラウザで確認 - regex-07: * + ? ― 繰り返しの基本3記号 —
+が「1回以上」を表すことを実際のテキストで確認 - regex-04: 文字クラス ― [ ] でどれか1文字を指定する —
[ ]の中に候補を並べる書き方の基本
電話番号・郵便番号の正規表現
日本の電話番号や郵便番号のように「数字とハイフンの組み合わせ」は、文字クラスと量指定子だけで十分表現できます。郵便番号なら ^\d{3}-\d{4}$(数字3桁 + ハイフン + 数字4桁)、固定電話なら市外局番の桁数がまちまちなので ^0\d{1,4}-\d{1,4}-\d{4}$ のように幅を持たせるのが現実的です。
「ちょうど何桁」「何桁から何桁まで」を指定する {n,m} の書き方は、regex-08: {n,m} ― 回数をきっちり指定する で、実際に桁数を変えながらマッチ・不一致を確認できます。\d{3} と \d{3,4} でマッチする文字列がどう変わるかを自分の目で見ておくと、桁数指定で迷わなくなります。
日付・時刻の正規表現
年月日は ^\d{4}-\d{2}-\d{2}$、時刻は ^([01]\d|2[0-3]):[0-5]\d$ が定番です。時刻のパターンは一見複雑ですが、分解すると次の組み合わせにすぎません。
[01]\d…0か1に続けて数字1つ(00〜19)2[0-3]…2に続けて0〜3(20〜23)([01]\d|2[0-3])… 上の2つを|(選択)でつなぎ、00〜23時を表す:[0-5]\d…:に続けて0〜5+ 数字(00〜59分)
| で複数の候補をまとめて選ぶ書き方は regex-13: 選択 ― | で「AまたはB」を表す で、( ) で範囲をひとまとまりにする書き方は regex-12: グループ化 ― ( ) で複数の要素を束ねる で確認できます。この2つを組み合わせられるようになると、時刻のような「条件つきの数値範囲」も自分で組み立てられるようになります。
年月日から年・月・日をそれぞれ別々の値として取り出したい場合は (\d{4})-(\d{2})-(\d{2}) のように ( ) で囲むと、マッチした一部分だけを番号付きで取得できます。これは regex-14: キャプチャグループ ― マッチした一部を取り出す で扱っているテーマで、実際に日付の文字列から年・月・日が別々に取れる様子をブラウザで確認できます。
URL・IDの正規表現
URLをざっくり判定する ^https?://[\w./?%&=-]+$ は、https? の ? が「s があってもなくてもよい」(0回か1回)を表しています。この ? の使い方は regex-07: * + ? ― 繰り返しの基本3記号 で *・+ とあわせて練習できます。
英数字だけのID・ユーザー名を「3〜16文字」のように長さ制限つきで判定したいときは ^[A-Za-z0-9_]{3,16}$ が使えます。[A-Za-z0-9_] の部分がよく分からない場合は、まず regex-04: 文字クラス ― [ ] でどれか1文字を指定する で範囲指定(A-Z のようなハイフンを使った書き方)を確認してから組み立てると理解が早いです。
つまずきやすいところ
正規表現を書き始めたばかりの人が高確率でつまずくポイントが2つあります。
.が「ピリオドそのもの」ではなく「任意の1文字」を表すこと。 メールアドレスの.をそのまま書いてしまうと、.の位置にどんな1文字が来てもマッチしてしまいます。本物のピリオドとして扱いたいときは\.とエスケープします。詳しくは regex-03: エスケープ ― 記号を「ただの文字」として扱う を参照してください。- 量指定子が「欲張り(greedy)」にできるだけ広い範囲にマッチしてしまうこと。 たとえば
<.*>は<b>太字</b>のような文字列に対して、想像より広い範囲を一気にマッチさせてしまいます。この性質と対処法は regex-09: 欲張りと控えめ ― greedy と lazy で実際のテキストを使って確認できます。
いずれもコースの regex-01: 正規表現とは ― パターンで文字列を捕まえる から順番に進めば自然に押さえられるようになっている内容です。「なぜ思った通りにマッチしないのか」に一度ぶつかっておくと、以後のパターン作成がぐっと楽になります。
次に読む
- 正規表現コース — 全18レッスンすべて
mode: browser。ブラウザ内の正規表現エンジンにパターンを打ち込み、マッチ箇所がその場でハイライトされる実行環境で学べる無料コース - regex-01: 正規表現とは ― パターンで文字列を捕まえる — まずはここから
- regex-06: 定義済み文字クラス ― \d \w \s の省略記法 — メール・電話番号の部品となる
\d\w\s - regex-08: {n,m} ― 回数をきっちり指定する — 郵便番号・電話番号の桁数指定
- regex-12: グループ化 ― ( ) で複数の要素を束ねる / regex-13: 選択 ― | で「AまたはB」を表す — 時刻や日付のような条件つきパターンの組み立て方
- regex-17: 定番パターン集 ― そのまま使えるレシピ — この記事のパターン一覧の元になっているレッスン