なぜ
/<.+?> e/.exec("a <b> c <d> e")
(意外に)戻る
["<b> c <d> e"]
それ以外の
["<d> e"]
貪欲でないオペレーターは何もしていないようです...
なぜ
/<.+?> e/.exec("a <b> c <d> e")
(意外に)戻る
["<b> c <d> e"]
それ以外の
["<d> e"]
貪欲でないオペレーターは何もしていないようです...
これにより、遅延演算子の役割を理解できます。
/<.+?> 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
ます)。
これは理解しておくべき非常に重要なポイントです。正規表現指向のエンジンは、後で「より良い」一致が見つかったとしても、常に左端の一致を返します。
正規表現エンジンは文字列を左から順番に見ていき、文字ごとに「ここから始まる一致を見つけることができますか?」と言います。非貪欲な演算子は、それがなくても一致が見つかる場合、一致が見つかることを決して妨げないため、エンジンは試行を続けます。つまり、最初の からチェックを開始すると<
、一致が見つかり、すぐに返されます (<
それほど遠くないため、2番目から始まる一致を常にチェックします)。
あなたが望むように見えるものに一致させるために、「e」が続く山括弧の単一のセットは>
、真ん中に何もないことを確認するだけです.
<[^>]+>[ ]e
(必要があるからではなく、わかりやすくするためにスペースが文字クラスに含まれていることに注意してください。)