正規表現量指定子
*, +, ?, {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+)+ のようにネストされた量指定子は、マッチに失敗した場合に指数的な時間がかかる可能性があります。ユーザー入力に対して正規表現を適用する場合は、パターンの安全性を事前に検証するか、タイムアウトを設定することが推奨されます。
バックトラッキングを構文レベルで抑え込む道具として、独占的量指定子 (possessive quantifier) の *+、++ やアトミックグループ (?>...) があります。いずれも一度マッチした範囲を後から手放さないため、失敗時の組み合わせ爆発が起きません。ただし独占的量指定子が使えるのは Perl・PCRE・Java などで、.NET はアトミックグループのみの対応です。JavaScript には 2026 年時点でどちらも入っていません。Node.js 26 で a*+ や (?>a) を書くとどちらも構文エラーになります (TC39 に提案はありますが標準化前です)。JavaScript では入れ子の繰り返しを書かない設計でしのぐことになります。
文字数カウントとの関連では、量指定子は文字数制限の検証に直接活用できます。{n,m} で入力文字数の範囲を指定し、フォームバリデーションやデータベースのカラム長チェックに利用されます。また、\s+ で連続する空白を検出して正規化するなど、テキストの前処理にも量指定子は欠かせません。
ただし文字数制限に使う場合の落とし穴として、{n,m} が数える単位は人が見た 1 文字とは一致しません。u フラグを付けない . は UTF-16 のコード単位 1 つに対応するため、家族を表す絵文字 (4 人の人物を ZWJ でつないだもの) は 11 個と数えられ、/^.{1,10}$/ では弾かれます。u フラグを付けるとコードポイント単位になり、同じ絵文字は 7 個と数えられて通ります。人が数える 1 文字に合わせたいなら量指定子ではなく Intl.Segmenter で書記素クラスタに分割してから個数を見る必要があります。どの単位で数えているかを決めないまま {n,m} で上限を書くと、絵文字や結合文字を含む入力だけが理由の分からないエラーになります。