2015-12-28 13 views
7

this質問への回答を詳述しようとしていますが、私は現在ゼロ長正規表現の動作/意味について言及しようとしています。ゼロレングスの正規表現と無限のマッチはありますか?

私はしばしば正規表現で何が起こっているかをテスト/デバッグ/理解するためにwww.regexr.comを遊び場として使用します。

だから我々はこの最も陳腐なシナリオを持っている:

正規表現はa*

入力文字列がdgwawa (実際のところ、ここでは文字列は無関係です)

なぜ、この動作であります前の文字が0回出現したので、この正規表現は無限に一致すると報告していますか?

なぜ結果は6つの一致ではありません。なぜなら、一致するかどうかは一致しないため、一致するかどうかにかかわらず、各文字の位置に1つずつです。

どのようにして無限に一致するのですか?だから、チェック/進捗一度にキャラクターですか?

どのように/無限ループになるのでしょうか?

enter image description here

答えて

11

regexr.comオンライン正規表現テスターは、JavaScriptの正規表現のテスト用に設計されています。空の文字列に一致するパターンが渡された場合、JavaScript regexエンジンは自動的にインデックスを移動しません。あなたは.NET Regex.Matchesで観察された行動、PHP preg_match_allをエミュレートする必要があるときに、なぜ、Pythonのre.finditerある

など手動で各位置をテストするための指標を進める必要があります。

regex101.com testを参照してください:

var re = /a*/g; 
 
var str = 'dgwawa'; 
 
var m; 
 
    
 
while ((m = re.exec(str)) !== null) { 
 
    if (m.index === re.lastIndex) { // <- this part 
 
     re.lastIndex++;    // <- here 
 
    }         // <- is important 
 
    document.body.innerHTML += "'" + m[0] + "'<br/>"; 
 
}

あなたはそのifブロックを削除する場合は、無限ループを取得します。

これに関して言及するには、2つの非常に重要なことがあります。空の文字列 を一致させることができますアンカーされないパターンを使用して

  • 必ずプログラミング言語のための適切なオンライン正規表現テスターを使用し
  • 避けは
+0

ニース。正規表現が特定の正規表現のフレーバーに従う前に私は言いました。これをもっと真剣に考慮する必要があります。 – Veverke

+1

必要なものを選択するには[*オンラインサンドボックス(オンラインで正規表現をテストして公開する)*](http://stackoverflow.com/tags/regex/info)セクションを参照してください。 –

+0

完全な答えをansの洞察に感謝!よくできました。 – Veverke

1

7試合

が実際に存在する二番目の数字は、私がregex101を使用して、それの長さ

Match 1:    0  0 
Match 2:    1  0 
Match 3:    2  0 
Match 4: a  3  1 
Match 5:    4  0 
Match 6: a  5  1 
Match 7:    6  0 

で、最初の数は、開始(0ベース)で、私はそれらを列挙してみましょう私たちの大部分がこの単純な正規表現(正規表現の方言があるとします)から何を期待していますか。

https://regex101.com/r/mN4jA4/1

+0

私はサイトが7を報告した場合私は幸せだろう、私の問題は、レポートは "無限"の一致ですか?私はあなたのように思うだろうが、そのような仕組みはうまくいかないと思う。 – Veverke

関連する問題