このパターン:
/a+?b+?/
次の文字列に対して:
aaaaaabbbbbb
一致:
aaaaaab
欲張りでないものは、後方/左方向(すべてを取る)と前方/右方向(1つだけを取る)で異なる動作をすることがわかります。
すべてに一致する最初の欲張りでa
ないものを、できるだけ一致しないようにする方法はありますか?最後の部分と同じように動作するようにb
?
このパターン:
/a+?b+?/
次の文字列に対して:
aaaaaabbbbbb
一致:
aaaaaab
欲張りでないものは、後方/左方向(すべてを取る)と前方/右方向(1つだけを取る)で異なる動作をすることがわかります。
すべてに一致する最初の欲張りでa
ないものを、できるだけ一致しないようにする方法はありますか?最後の部分と同じように動作するようにb
?
正規表現は通常、右から左へのフラグを設定しない限り、左から右に一致します (これをサポートするフレーバーはほとんどありません)。どちらの場合も、後読みを使用しても、途中で開始して両方向に機能することはありません。
立ち止まって自問することが役に立ちます - そもそもなぜ怠惰な量指定子が存在するのでしょうか? それはどのような問題を解決することを意図していましたか?
通常の (貪欲な) 量指定子は、テキストの一致するパターンを見つけてから、一致しなくなるまで一連の文字を繰り返し一致させることによって機能します。通常はこの動作が望まれますが、非常に一般的なパターンの後に非常に具体的なパターンが続き、特定のパターンが一般的なパターンのサブセットである場合、問題が発生します。
たとえば、次の入力について考えてみます。
_abc_END_def_END
そして、このパターン:
(\w+END)
意図は、一致_abc_
してからEND
. 問題は、それEND
が のサブセットであること\w+
です。標準の「貪欲な」ルールを使用して、 は\w+
可能な限り一致します。つまり、一致するのではなく、一致_abc_
しました_abc_END_def
。
このシナリオの解決策は、量指定子 ( +
) が遅延修飾子で動作する方法を変更すること?
です。式を に変更することにより\w+?
、正規表現エンジンは、式を満たすために必要なだけ一致するように強制され、それ以上は一致しなくなります。式は、そのリテラル文字列と\w+?
一致する場合に満たされます。_abc_
END
遅延量指定子の目的は、「最小」文字数に一致することではありません。最初のパターンのサブセットである 2 番目のパターンに一致する機会を与えることです。
あなたの例でb
は、 のサブセットでa
はないため、遅延量指定子は必要ありません。1 つ以上の a を一致させたいが、できるだけ少なく、1 つ以上の b をできるだけ少なく一致させたい場合は、単純に次のように使用します。
ab
または、あなたa
が b を含むスーパーセットの代役である場合:
[ab]b
例えば:
\wb
どちらも次のように一致します。
ab
例:
const input = "aaabbb"
console.log(/ab/.exec(input)[0])
彼らは同じように振る舞います!遅延量指定子 (この場合は lazy +
) は、正規表現エンジンに次のように指示します。
+
) 。あなたが暗示しているように、正規表現は「左向き」または「後ろ向き」と一致しません。
正確に何を達成しようとしていますか?この単純な例ではないと思います-それは簡単に修正できます(ab
おそらく探しているものではない regex を作成するだけです)。