正規表現量指定子
*, +, ?, {n,m} などの繰り返し回数を指定するメタ文字。直前の要素の出現回数を制御する。
正規表現量指定子 (Quantifier) は、直前のパターン要素の繰り返し回数を指定するメタ文字です。基本的な量指定子として * (0 回以上)、+ (1 回以上)、? (0 回または 1 回)、{n} (ちょうど n 回)、{n,} (n 回以上)、{n,m} (n 回以上 m 回以下) があります。
量指定子にはデフォルトの「貪欲 (greedy)」モードと、? を付けた「最短 (lazy)」モードの 2 つの動作があります。貪欲モードではできるだけ多くの文字にマッチし、最短モードでは最小限の文字にマッチします。たとえば文字列「<b>太字</b>と<b>強調</b>」に対して、<b>.*</b> (貪欲) は全体にマッチしますが、<b>.*?</b> (最短) は「<b>太字</b>」だけにマッチします。正規表現詳解の書籍で貪欲マッチと最短マッチの違いを学べます。
実務での活用例として、/\d{3}-\d{4}/ は郵便番号 (123-4567) のパターンにマッチし、/[a-zA-Z]{2,}/ は 2 文字以上の英単語にマッチします。入力フォームのバリデーションでは {n,m} を使って文字数の範囲を制限できます。たとえばユーザー名を 3〜20 文字に制限するには /^[a-zA-Z0-9_]{3,20}$/ のようなパターンを使います。
量指定子を使う際の重要な注意点として、バックトラッキングの爆発 (ReDoS: Regular Expression Denial of Service) があります。(a+)+ のようにネストされた量指定子は、マッチに失敗した場合に指数的な時間がかかる可能性があります。ユーザー入力に対して正規表現を適用する場合は、パターンの安全性を事前に検証するか、タイムアウトを設定することが推奨されます。
JavaScript の ES2024 では独占的量指定子 (possessive quantifier) の議論も進んでおり、バックトラッキングを抑制する *+、++ などの構文が将来的に利用可能になる可能性があります。現時点では、アトミックグループ (?>...) を使って同様の効果を得られる言語もあります。プログラミングセキュリティの書籍で ReDoS 対策が解説されています。
文字数カウントとの関連では、量指定子は文字数制限の検証に直接活用できます。{n,m} で入力文字数の範囲を指定し、フォームバリデーションやデータベースのカラム長チェックに利用されます。また、\s+ で連続する空白を検出して正規化するなど、テキストの前処理にも量指定子は欠かせません。