正規表現の実例集 - 郵便番号・メール・電話番号・URL抽出のコピペ用パターン
正規表現は覚えるより使い回すのが現実的です。 このページでは、日本で実務によく出てくるパターンをコピペできる形で並べました。 各パターンはRegex Testerで テストデータを貼り付けて確認できます。
/^\d{3}-?\d{4}$/ の構造(郵便番号パターン)1. 日本の郵便番号(7桁・ハイフン任意)
/^\d{3}-?\d{4}$/100-0001 も 1000001 もマッチします。 古い顧客データにはスペース区切りや全角数字が混じることがあるので、 前処理で String.prototype.normalize("NFKC")をかけてから正規化すると事故が減ります。
2. 日本の電話番号(固定・携帯・IP電話)
/^(0\d{1,4}-\d{1,4}-\d{3,4}|0\d{9,10})$/ハイフン有り無し両対応の現実的なパターンです。国際プレフィックス +81 を許容するなら 以下のように拡張します。
/^(\+81-?|0)(\d{1,4}-?\d{1,4}-?\d{3,4})$/完全バリデーションを目指すと携帯のプレフィックス一覧(070/080/090/050など)を厳密化する必要がありますが、 実務では「ユーザーが正しい番号を入力したか」ではなく「送信先システムが受け付ける形式か」で 区切るほうが現実的です。
3. メールアドレス(現実解)
/^[^\s@]+@[^\s@]+\.[^\s@]+$/RFC5322完全準拠のパターンは数百文字になり、実務では扱いきれません。 上記の「@が1つ・空白無し・ドメインにドットあり」で十分なことが多いです。 厳密にやりたい場合はHTMLの input type="email" のブラウザ実装仕様である WHATWGパターンを採用するのが妥当です。
4. URL抽出(httpsから始まる)
/https?:\/\/[\w\-._~:\/?#\[\]@!$&'()*+,;=%]+/gログや記事本文からURLをまとめて拾いたいときに便利です。 末尾の句読点や括弧を除外したいケースが多いので、/g でマッチさせた後に trim + 末尾記号の削除をかけるのが実用的です。
5. 和暦(令和○年)を西暦に寄せる
/令和(\d{1,2})年/キャプチャした数値に2018を足すと西暦になります。 元号が変わるとロジックが壊れるので、 マッチ部分を年号テーブルと突合するコードを挟むほうが長持ちします。
6. クレジットカード番号(4桁区切りゆるめ)
/^(?:\d{4}[-\s]?){3}\d{4}$/表示用チェックに限定してください。 実際の有効性判定はLuhnアルゴリズムで別途行うのが必須です。
7. 半角英数のみ・日本語を含むか
// 半角英数のみ
/^[A-Za-z0-9]+$/
// 日本語を含むか(ひらがな・カタカナ・漢字)
/[\u3040-\u309f\u30a0-\u30ff\u4e00-\u9faf]/サロゲートペア(絵文字など)を考慮する場合は /u フラグを付けて\p{Script=Hiragana} などのUnicodeプロパティを使うと短く書けます。
.* と非欲張りマッチ .*? の違い<b>foo</b><b>bar</b><b>.*</b>(隣まで飲み込む)<b>.*?</b>(最短で止まる)よくある落とし穴
- 欲張りマッチ:
.*はできるだけ長くマッチしようとするので、 タグ抽出で意図せず隣のタグまで飲み込みます。.*?(非欲張り)を使うか、 対象文字の否定クラス[^<]*を使うのが安全です。 - エスケープ忘れ: ドット(
.)は任意の1文字にマッチします。 拡張子や小数点を扱うときは\\.と書かないと誤マッチします。 - 全角半角の揺れ: 日本語の入力フォームでは全角英数・全角スペースが混じります。 マッチ前に
normalize("NFKC")をかけるか、 文字クラスに両方入れて対応してください。 - 行頭・行末の意味:
^と$は/m(multiline)フラグの有無で挙動が変わります。 複数行入力を想定する場合は明示的にフラグを付けましょう。
テスト方法
パターンを思いついたら、Regex Testerで 実データを貼り付けてマッチを確認してください。 マッチ箇所がハイライトされ、グループキャプチャの内容も一覧で確認できます。 ブラウザ内で完結するので、個人情報を含むデータでも安心してテストできます。