正規表現(Regular Expression、Regex)の文法自体は難しくありませんが、「正しい」検証パターンをゼロから書くには、多くのエッジケースを考慮する必要があります。本文では文法の解説はせず、すぐに使える実践パターンを直接提供します。各パターンには説明・境界ケース・注意事項が付いています。正規表現ツールに貼り付けてテストできます。
1. メールアドレス検証
メール形式は単純に見えますが、RFC 5322 の完全な仕様は非常に複雑です。以下は実用的な「十分」なバージョンで、実際のメールアドレスの 99% をカバーします:
/^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$/
| テスト文字列 | 結果 | 説明 |
|---|---|---|
| [email protected] | ✅ 通過 | 標準形式 |
| [email protected] | ✅ 通過 | プラス記号・サブドメイン含む |
| user@example | ❌ 拒否 | トップレベルドメインなし |
| @example.com | ❌ 拒否 | ローカル部分なし |
| user @example.com | ❌ 拒否 | スペース含む |
注意:メール検証の最終手段は確認メールの送信です。Regex は明らかな形式エラーを除外できますが、メールが実際に存在するかは確認できません。
2. 日本の携帯電話番号
/^0[789]0\d{8}$/
日本の携帯電話番号は 070/080/090 から始まる 11 桁です。ハイフンありの場合:
/^0[789]0-\d{4}-\d{4}$/
3. 日付形式(YYYY-MM-DD)
/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/
このパターンは月(01〜12)と日(01〜31)の有効範囲を検証しますが、その月に実際に何日あるかは検証できません(例:2023-02-30 は通過します)。正確な日付の有効性にはプログラムロジックが必要です。
4. URL
/^https?:\/\/[^\s/$.?#].[^\s]*$/i
http と https をカバーし、複雑なパス・クエリパラメータ・ハッシュを許可し、スペースを含む無効な URL を除外します。HTTPS のみ許可する場合:
/^https:\/\/[^\s/$.?#].[^\s]*$/i
5. IPv4 アドレス
/^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$/
各 octet の範囲(0〜255)を正確に検証し、999.999.999.999 のような形式は正しくても値が無効なケースを防ぎます。
6. パスワード強度ルール
基本(8文字以上、英字と数字を含む):
/^(?=.*[a-zA-Z])(?=.*\d).{8,}$/
中程度(8文字以上、大文字・小文字・数字を含む):
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/
厳格(8文字以上、大文字・小文字・数字・特殊文字を含む):
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*]).{8,}$/
7. 数値形式
正の整数:
/^\d+$/
整数(マイナス符号含む):
/^-?\d+$/
浮動小数点数:
/^-?\d+(\.\d+)?$/
8. 日本語・中国語文字(CJK 統合漢字)
/^[\u4e00-\u9fff\u3040-\u30ff]+$/
このパターンは CJK 統合漢字と日本語の平仮名・片仮名をカバーします。
9. 日本の郵便番号
/^\d{3}-\d{4}$/
ハイフンなしの場合:
/^\d{7}$/
10. HTML タグの除去
/<[^>]+>/g
空文字列に置換することでテキストから HTML タグを除去できます。JavaScript の例:
const cleanText = htmlString.replace(/<[^>]+>/g, '');
注意:完全な HTML 構造の解析に Regex は推奨されません。完全な HTML 解析には DOM Parser を使用してください。
よくあるミスと注意事項
1. ^ と $ の忘れ
アンカーのないパターンは「部分一致」で通過します。^ と $ を追加することで文字列全体が形式に合致していることを確認できます。
2. 過度に厳格なパターンによる誤拒否
{2,} を使用することで、新しいトップレベルドメインを持つ正当なメールの誤拒否を防げます。
3. 大文字・小文字の区別
URL パターンには i フラグを追加し、Email パターンは通常大文字・小文字を区別します。