2016-12-27 5 views
1

なぜ次の正規表現は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を使用しました)

+0

正規表現は最長一致を抽出するための適切なツールではありません。すべての部分文字列を取得し、 '^ 10 + 1 $'パターンでテストし、言語固有の手段を使用して最長のものを得ることができます。 –

+0

マッチ関数で '/ 1(0+)1 /' regexを使い、結果に長さ関数を適用して最長一致を見つけます。 –

+1

'+'は欲張りですが、最初の試合になり、中間の '1'が最初の試合に含まれるので、将来の試合には含まれず、' 1001'は決してマッチしません。 – muru

答えて

1

貪欲手段は右端の発生まで、それは入力文字列で最長意味はありません。

正規表現自体は、最長一致を抽出するための正しいツールではありません。パターンに合った部分文字列をすべて取得し、言語固有の手段を使用して最長のものを得ることができます。

文字列は左から右に解析されているので、101は最初101001にマッチしてしまいますと、(1011001マッチがを重ねあるとして)残り(001)が一致しません。 /(?=(10+1))./gを使用して、各グループ1の値の長さを調べて、最長の値を取得することができます。

var regex = /(?=(10+1))./g; 
 
var str = "101001"; 
 
var m, res=[]; 
 

 
while ((m = regex.exec(str)) !== null) { 
 
    res.push(m[1]); 
 
} 
 
console.log(res); // => ["101", "1001"] 
 

 
if (res.length>0) { 
 
    console.log("The longest match:", res.sort(function (a, b) { return b.length - a.length; })[0]); 
 
} // => 1001

3

正規表現は常に左からの読み込み右!それはもっと長いものを探しません。複数のマッチの場合は、正規表現を取得して長さを自分で比較するために正規表現を再実行する必要があります。

+0

あなたは「貪欲」のより良い定義を提供できますか? (意味がありません、最長を見つけるのですか?) – Kev

+0

貪欲というのは、可能な限り一致することを意味します。例:あなたの文字列 "101001"。この正規表現 '1 + 1'を使うと、それは欲張りなのですべて一致します。しかし、この正規表現 '1。+?1 'を使用すると、貪欲ではなく、" 101 "(https://regex101.com/r/GeDOZL/1参照)にのみ一致します。私の説明が間違っていることを願っています – Fallenhero

+0

いいえ、 '1011'ではなく' 1(0+)1'にできるだけ近い '1001'にマッチする文字列はありませんか? – Kev

関連する問題