なぜ次の正規表現は1001
の代わりに101
を返しますか?+は貪欲であると思われるので、どうして私は怠け者の結果を得ていますか?
console.log(new RegExp(/1(0+)1/).exec('101001')[0]);
私は+
は貪欲だと思ったので、2つのマッチの長が返されます。
IMOこれはUsing javascript regexp to find the first AND longest matchとは異なります。なぜなら、最初のものは気にしません。誰かが貪欲の私の定義を修正することはできますか?たとえば、上記のスニペットと古典的な「おっとり、欲張りすぎる」というnew RegExp(/<(.+)>/).exec('<b>a</b>')[0]
の例の違いは、b>a</b
です。
(注:これは、言語に依存しないように思わ(それはまた、Perlで起こる)が、ちょうどでブラウザにそれを実行しているの容易さのために私はここではJavaScriptを使用しました)
正規表現は最長一致を抽出するための適切なツールではありません。すべての部分文字列を取得し、 '^ 10 + 1 $'パターンでテストし、言語固有の手段を使用して最長のものを得ることができます。 –
マッチ関数で '/ 1(0+)1 /' regexを使い、結果に長さ関数を適用して最長一致を見つけます。 –
'+'は欲張りですが、最初の試合になり、中間の '1'が最初の試合に含まれるので、将来の試合には含まれず、' 1001'は決してマッチしません。 – muru