当我使用正则表达式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如何知道它会失败并且不会回溯?
我阅读了掌握正则表达式但没有找到任何答案。谢谢你的帮助。
对不起图片,我无权上传图片。
答案 0 :(得分:2)
RegexBuddy的正则表达式引擎使用所有格量词在内部将正则表达式优化为ID:\s*+\d*0
和ID: \s*+\d+q
。它可以执行此操作,因为\s
和\d
是互斥的,\d
和q
也是如此。掌握正则表达式称之为“自动拥有”。
在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
并在执行编译表达式之前拒绝匹配。第二个例子也是如此。