正規表現の文字クラス入門|文字数パターンマッチング
フォーム入力のバリデーションやテキスト解析において、正規表現の文字クラスは欠かせない技術です。文字の種類と文字数を同時に制御できるため、ユーザー入力の検証からデータクレンジングまで幅広く活用されています。
文字クラスの基本
文字クラスは角括弧 [] で囲んだ文字の集合を表します。マッチさせたい文字の範囲や種類を柔軟に指定できます。
| 文字クラス | 意味 | 使用例 |
|---|---|---|
[a-z] | 小文字の英字 1 文字 | ユーザー名の検証 |
[A-Z] | 大文字の英字 1 文字 | 略称・コードの検証 |
[0-9] | 数字 1 文字 | 電話番号・郵便番号 |
[a-zA-Z0-9] | 英数字 1 文字 | パスワード・ID |
\d | [0-9] と同等 | 数値の抽出 |
\w | [a-zA-Z0-9_] と同等 | 単語の抽出 |
\s | 空白文字 | 区切り文字の検出 |
否定文字クラス [^...] を使えば、指定した文字以外にマッチさせることも可能です。たとえば [^0-9] は数字以外の任意の 1 文字にマッチします。
量指定子による文字数制限
文字クラスと量指定子 (quantifier) を組み合わせることで、文字数の範囲を正確に制御できます。
| 量指定子 | 意味 | パターン例 |
|---|---|---|
{n} | ちょうど n 回 | \d{4} → 4 桁の数字 |
{n,} | n 回以上 | [a-z]{3,} → 3 文字以上の英小文字 |
{n,m} | n 回以上 m 回以下 | \w{6,20} → 6〜20 文字の英数字 |
+ | 1 回以上 ({1,}) | [A-Z]+ → 1 文字以上の大文字 |
* | 0 回以上 ({0,}) | \d* → 0 文字以上の数字 |
? | 0 回または 1 回 | -? → ハイフンの有無 |
パスワードの文字数制限であれば ^[a-zA-Z0-9!@#$%]{8,32}$ のように、先頭 ^ と末尾 $ のアンカーを付けて文字列全体を検証します。
日本語文字のマッチング
日本語を含むテキストの文字数検証では、Unicode プロパティエスケープが有効です。JavaScript の場合、u フラグを付けることで Unicode 対応の正規表現を使用できます。
| パターン | 対象 | 説明 |
|---|---|---|
[\u3040-\u309F] | ひらがな | 「あ」〜「ん」の範囲 |
[\u30A0-\u30FF] | カタカナ | 「ア」〜「ン」の範囲 |
[\u4E00-\u9FFF] | 漢字 (CJK 統合漢字) | 基本的な漢字の範囲 |
\p{Script=Hiragana} | ひらがな (Unicode プロパティ) | ES2018 以降で使用可能 |
\p{Script=Katakana} | カタカナ (Unicode プロパティ) | ES2018 以降で使用可能 |
たとえば、全角文字のみで 1〜10 文字の入力を検証するには /^[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF]{1,10}$/u と記述します。
実践的な文字数バリデーション
実務でよく使われる文字数バリデーションのパターンを紹介します。入力フォームの検証に直接活用できます。
| 用途 | 正規表現パターン | 文字数 |
|---|---|---|
| 郵便番号 | ^\d{3}-?\d{4}$ | 7〜8 文字 |
| 電話番号 | ^0\d{1,4}-?\d{1,4}-?\d{4}$ | 10〜13 文字 |
| メールアドレス | ^[\w.+-]+@[\w-]+\.[\w.]+$ | 6〜254 文字 |
| ユーザー名 | ^[a-zA-Z0-9_]{3,20}$ | 3〜20 文字 |
| パスワード | ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$ | 8 文字以上 |
パスワードの例では先読み (lookahead) (?=...) を使い、英小文字・英大文字・数字をそれぞれ 1 文字以上含むことを条件にしています。文字数の制約と文字種の制約を同時に表現できるのが正規表現の強みです。
まとめ
正規表現の文字クラスと量指定子を組み合わせれば、文字の種類と文字数を同時に制御する強力なバリデーションが実現できます。日本語を扱う場合は Unicode 対応を忘れずに設定しましょう。実装前に文字カウンタスで対象テキストの文字数を確認しておくと、正規表現パターンの設計がスムーズに進みます。