なぜ
/<.+?> 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
(必要があるからではなく、わかりやすくするためにスペースが文字クラスに含まれていることに注意してください。)