regexbuddy有时候不回溯

时间:2013-06-09 06:44:06

标签: regex regexbuddy

当我使用正则表达式ID:\s*\d*0匹配ID: 12344y时,regexbuddy会给我结果

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如何知道它会失败并且不会回溯?

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

对不起图片,我无权上传图片。

2 个答案:

答案 0 :(得分:2)

RegexBuddy的正则表达式引擎使用所有格量词在内部将正则表达式优化为ID:\s*+\d*0ID: \s*+\d+q。它可以执行此操作,因为\s\d是互斥的,\dq也是如此。掌握正则表达式称之为“自动拥有”。

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

答案 1 :(得分: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并在执行编译表达式之前拒绝匹配。第二个例子也是如此。