コンテンツへスキップ
uencoder

正規表現の量指定子(*、+、?、{n,m})を使う

量指定子はパターンの繰り返し回数を指定します。貪欲、怠惰、絶対的マッチングを学び、破壊的バックトラッキングを避けましょう。

  1. 1

    量指定子:* (0 回以上)、+ (1 回以上)、? (0 回または 1 回)、{n} (ちょうど n 回)、{n,m} (n 回から m 回)、{n,} (n 回以上) です。デフォルトでは貪欲 (できるだけ多くマッチ) です。? を付けると怠惰 (できるだけ少なくマッチ) になります:*?、+?、??。+ を付けると絶対的 (バックトラックなし) になります:*+、++。怠惰はよく使われ、絶対的は破滅的バックトラックを防ぎます。

  2. 2
    正規表現テスター →

    貪欲と怠惰の量指定子を比較します。.* (貪欲、末尾までマッチ) と .*? (怠惰、最小限だけマッチ) を比べてください。<div>content</div> のような HTML では、<.*> は文字列全体にマッチします (貪欲) が、<.*?> は <div> だけにマッチします (怠惰)。

  3. 3
    正規表現置換ツール →

    置換で量指定子を使います。\d{4} を **** に置き換えて 4 桁の数字をマスクしたり、[a-z]+ で単語を置き換えたりします。さまざまな入力でテストして、量指定子が意図した繰り返し回数にマッチすることを確認してください。

よくある質問

破滅的バックトラックとは何ですか?
入れ子になった量指定子 (例:(a+)+) を含む正規表現がマッチに失敗すると、エンジンは諦める前に指数関数的に多くの組み合わせを試します。短い入力でも数分間ハングすることがあります。絶対的量指定子 ((a++)+)、アトミックグループ、パターンの書き換えで修正してください。信頼できない入力に対する正規表現には、必ずタイムアウトを設定してください。
怠惰と貪欲はいつ使い分けますか?
最短のマッチが欲しいとき (典型的には区切り文字の間、HTML タグや引用文字列) は怠惰 (*?、+?) を使います。最長のマッチが欲しいとき (典型的には行末まで、またはパターンがアンカーされている場合) は貪欲 (*、+) を使います。区切り文字で囲まれた内容には、実際のほとんどのケースで怠惰が使われます。

このタスクを解決するワークフロー

関連ツール