JavaScript 正規表現 非グリーディなパターンマッチング
グリーディなパターンマッチングとは
デフォルトの状態ではパターンマッチングでは、パターンに合致する限りなるべくたくさんの文字にマッチするようにマッチします。
例えば、 \d+ というパターンは「ひとつ以上の数字」の意味ですが、 文字列 '5678' という入力に対して、 5678 という全体がマッチします。
const r = /\d+/
const m = r.exec('5678')
if (m) {
console.log(m[0])
// 5678
}
「ひとつ以上の数字」という意味では、例えば先頭の 5 という部分だけでもパターンに合致するのですが、全体をマッチさせます。
このように、正規表現ではなるべく多くの文字を取り込むようにマッチするのが基本になります。この動作を「グリーディである」 (greedy, 「貪欲な」の意味) という言い方をします。
? 非グリーディなパターンマッチング
正規表現の出現回数指定に ? をつけることで、非グリーディ (non-greedy) なマッチングになります。
次の例では、 \d+? とすることで、マッチに必要な最小回数 (ここでは 1 回) の数字 \d の出現でマッチします。
const r = /\d+?/
const m = r.exec('5678')
if (m) {
console.log(m[0])
// 5
}
{n,m}? の場合も同様に、最低限の出現回数を満たしたところでマッチします。
const r = /\d{2,3}?/
const m = r.exec('5678')
if (m) {
console.log(m[0])
// 56
}