JavaScriptにおける正規表現の貪欲さの制限
正規表現はデフォルトで貪欲です。 これは、可能な限り多くの文字をキャプチャすることを意味します。 例を使って見てみましょう。次のような文字列があるとします:
let str = 'aeeex zzz x kkk';
この文字列で、パターン文字
'a'、次に任意の文字が1回以上、次に文字'x'に基づいて
部分文字列'aeeex'を見つけたいとします。
let res = str.replace(/a.+x/g, '!');
結果、変数には文字列'! zzz x kkk'が書き込まれると予想します。しかし、
そうはならず、変数には文字列'! kkk'が入ります。
理由は、私たちの正規表現が文字'a'から文字'x'までのすべての
文字を探しているからです。
しかし、私たちの文字列には2つの文字'x'があります!貪欲さのため、
正規表現は最後の'x'まで探しに行き、その結果、予想とは異なる部分をキャプチャしてしまうのです。
もちろん、多くの場合、この動作はまさに私たちが必要としているものです。 しかし、この具体的なケースでは、貪欲さをキャンセルし、正規表現に最初の'x'まで 探すように指示したいのです。
貪欲さを制限するには、繰り返し演算子の後に疑問符を置きます:
let res = str.replace(/a.+?x/g, '!');
貪欲さはすべての繰り返し演算子に対して制限できます:*、?、{}
全てに対して、このように:*?、??、{}?。
次の文字列が与えられます:
let str = 'aba accca azzza wwwwa';
両端が文字'a'で囲まれたすべての文字列を見つけ、
それぞれを'!'に置き換える正規表現を書いてください。
文字'a'の間には('a'以外の)任意の文字を入れることができます。