2

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

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

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

对不起图片,我没有上传图片的权利。

4

2 回答 2

2

RegexBuddy 的正则表达式引擎在内部优化您的正则表达式ID:\s*+\d*0ID: \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"

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

于 2013-06-09T07:44:53.520 回答