5

なぜ

/<.+?> e/.exec("a <b> c <d> e")

(意外に)戻る

["<b> c <d> e"]

それ以外の

["<d> e"]

貪欲でないオペレーターは何もしていないようです...

4

5 に答える 5

3

これにより、遅延演算子の役割を理解できます。

/<.+?> e/.exec("a <b> c <d> e <f> e")` // -> ["<b> c <d> e", "<f> e"]
/<.+> e/.exec("a <b> c <d> e <f> e")`  // -> ["<b> c <d> e <f> e"]

<.+?> e意味: aが見つかったら、最初<のものを見つける > e

<.+> e意味: aが見つかったら、最後<の aを見つける > e

あなたの特定のケースでは、単に使用することができます<[^>]+> e(これはより迅速であるため、さらに優れています-可能な場合は、常にX[^X]X表記よりも表記を優先しX.*?Xます)。

于 2013-08-21T12:27:24.463 に答える
2

regular-expressions.infoから:

これは理解しておくべき非常に重要なポイントです。正規表現指向のエンジンは、後で「より良い」一致が見つかったとしても、常に左端の一致を返します。

正規表現エンジンは文字列を左から順番に見ていき、文字ごとに「ここから始まる一致を見つけることができますか?」と言います。非貪欲な演算子は、それがなくても一致が見つかる場合、一致が見つかることを決して妨げないため、エンジンは試行を続けます。つまり、最初の からチェックを開始すると<、一致が見つかり、すぐに返されます (<それほど遠くないため、2番目から始まる一致を常にチェックします)。

あなたが望むように見えるものに一致させるために、「e」が続く山括弧の単一のセットは>、真ん中に何もないことを確認するだけです.

<[^>]+>[ ]e

(必要があるからではなく、わかりやすくするためにスペースが文字クラスに含まれていることに注意してください。)

于 2013-08-21T12:26:18.700 に答える