2

正規表現を使用して regexbuddyID:\s*\d*0と一致させると、結果が得られますID: 12344y

https://raw.github.com/litsand/litsand.github.com/master/_posts/pic/4.png

一致を見つけるためにバックトラックしますが、バック\d*トラックしないでください\s*

正規表現をに変更するとID:\s*\d*q、バックトラックしなくなり、失敗メッセージが表示されます。

https://raw.github.com/litsand/litsand.github.com/master/_posts/pic/5.png

バックトラックしたとしても、最終的に正規表現は失敗メッセージを表示します。しかし、regexbuddy は、失敗してバックトラックしないことをどのように知っていたのでしょうか?

Mastering Regular Expressionsを読みましたが、答えが見つかりません。ご協力いただきありがとうございます。

写真で申し訳ありませんが、私には画像をアップロードする権利がありません。

4

2 に答える 2

2

RegexBuddy の正規表現エンジンは、正規表現を内部的に最適化し、所有量指定子ID:\s*+\d*0を使用します。ID: \s*+\d+qこれが可能なのは、\s\dが相互に排他的である\dためqです。正規表現をマスターすることを「自動所有」と呼びます。

RegexBuddy 3 では、正規表現デバッガーもこの最適化を使用します。そのため、デバッガーでバックトラッキングの手順が表示されませんでした。RegexBuddy 4 では、正規表現デバッガーですべての最適化が無効になっています。RegexBuddy 4 では、デバッガーは、「自動所有」を持たない正規表現エンジンで正規表現が行うすべてのバックトラッキングを表示します。

于 2013-07-16T13:48:05.050 に答える
1

アプリケーションで適切に示されていないいくつかの最適化である可能性があると推測しています。

たとえば、Perl では、両方の式がオプティマイザによって即座に失敗します。次の出力が得られます。

C:\>perl -Mre=debug -e"'ID: 12344y'=~/ID:\s*\d*0/"
Compiling REx "ID:\s*\d*0"
Final program:
   1: EXACT <ID:> (3)
   3: STAR (5)
   4:   SPACE (0)
   5: STAR (7)
   6:   DIGIT (0)
   7: EXACT <0> (9)
   9: END (0)
anchored "ID:" at 0 floating "0" at 3..2147483647 (checking anchored) minlen 4
Guessing start of match in sv for REx "ID:\s*\d*0" against "ID: 12344y"
Found anchored substr "ID:" at offset 0...
Contradicts floating substr "0", giving up...
Match rejected by optimizer
Freeing REx: "ID:\s*\d*0"

ID:オプティマイザーはとの存在をチェックしますが、コンパイルされた式を実行する前に一致0を見つけられず0、拒否します。2 番目の例でも同じことが起こります。

于 2013-06-09T07:44:53.520 に答える