13

このパターン:

/a+?b+?/

次の文字列に対して:

aaaaaabbbbbb

一致:

aaaaaab

欲張りでないものは、後方/左方向(すべてを取る)と前方/右方向(1つだけを取る)で異なる動作をすることがわかります。

すべてに一致する最初の欲張りでaないものを、できるだけ一致しないようにする方法はありますか?最後の部分と同じように動作するようにb

4

4 に答える 4

8

短い答え

正規表現は通常、右から左へのフラグを設定しない限り、左から右に一致します (これをサポートするフレーバーはほとんどありません)。どちらの場合も、後読みを使用しても、途中で開始して両方向に機能することはありません。

遅延量指定子はどのように機能しますか?

立ち止まって自問することが役に立ちます - そもそもなぜ怠惰な量指定子が存在するのでしょうか? それはどのような問題を解決することを意図していましたか?

通常の (貪欲な) 量指定子は、テキストの一致するパターンを見つけてから、一致しなくなるまで一連の文字を繰り返し一致させることによって機能します。通常はこの動作が望まれますが、非常に一般的なパターンの後に非常に具体的なパターンが続き、特定のパターンが一般的なパターンのサブセットである場合、問題が発生します。

たとえば、次の入力について考えてみます。

_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])

于 2013-03-04T14:12:51.997 に答える
-1

彼ら同じように振る舞います!遅延量指定子 (この場合は lazy +) は、正規表現エンジンに次のように指示します。

  • 最初の可能な位置から開始し、
  • 次に、できるだけ少ない文字に一致します ( a の場合は少なくとも 1 文字 +) 。
  • ただし、全体的な一致が発生するようにするために必要な数だけ一致します。

あなたが暗示しているように、正規表現は「左向き」または「後ろ向き」と一致しません。

正確に何を達成しようとしていますか?この単純な例ではないと思います-それは簡単に修正できます(abおそらく探しているものではない regex を作成するだけです)。

于 2013-03-03T21:53:28.333 に答える