regexbuddy有时不会回溯

regexbuddy有时不会回溯,regex,regexbuddy,Regex,Regexbuddy,当我使用正则表达式iID:\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.p

当我使用正则表达式i
ID:\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怎么知道它会失败而不回头呢

我读了《掌握正则表达式》,但没有找到任何答案。谢谢你的帮助


很抱歉,我没有上传图片的权利。

我猜可能是应用程序中没有正确说明某些优化

例如,在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"
C:\>perl-Mre=debug-e“'ID:12344y'=~/ID:\s*\d*0/”
正在编译REx“ID:\s*\d*0”
最终课程:
1:精确(3)
3:星(5)
4:空格(0)
5:星(7)
6:数字(0)
7:精确(9)
9:完(0)
锚定“ID:”在0浮动“0”在3..2147483647(检查锚定)最小4
在sv中猜测REx“ID:\s*\d*0”与“ID:12344y”的匹配开始
在偏移量0处找到锚定子字符串“ID:”。。。
与浮动子字符串“0”相矛盾,放弃。。。
匹配被优化器拒绝
释放REx:“ID:\s*\d*0”

优化器检查是否存在
ID:
0
,但没有找到
0
,甚至在执行编译的表达式之前都会拒绝匹配。第二个例子也是如此。

RegexBuddy的正则表达式引擎使用所有格量词对正则表达式进行内部优化,使其成为
ID:\s*+\d*0
ID:\s*+\d+q
。它可以这样做,因为
\s
\d
是相互排斥的,就像
\d
q
一样。掌握正则表达式称之为“自动占有”


在RegexBuddy 3中,regex调试器也使用此优化。这就是为什么您没有在调试器中看到回溯步骤。在RegexBuddy 4中,regex调试器禁用了所有优化。在RegexBuddy 4中,调试器将显示正则表达式在没有“自动占有”的regex引擎中所做的所有回溯操作。

您应该对所有您认为有用的答案进行投票,并接受最能回答您问题的答案(如果有)。您不需要任何声誉来接受您自己问题的答案。只需点击勾号。