“调试”选项卡上的RegexBuddy显示了如何逐步执行正则表达式。但这些步骤究竟意味着什么?每一步背后都有哪些操作?
2 回答
步数基本上是输入中当前位置改变了多少次,这是一个非常好的性能指标。
“当前位置”可以在任何字符或字符之间(包括整个输入之前和之后)。
简化它,正则表达式引擎通过沿输入移动当前位置并评估正则表达式是否在该位置匹配来处理输入。他们还跟踪匹配的正则表达式中的位置。
我不想把这个答案变成一个正则表达式教程,但是......正则表达式引擎总是在匹配的同时尽可能多地消耗输入。举一个简单的例子,给定输入"12345"
和正则表达式.*1.*
,正则表达式引擎将首先应用.*
消耗所有输入,离开输入末尾的位置,无法匹配 a 1
,然后通过一次“取消”一个字符来回溯,直到它找到 a 1
,然后继续。您可以看到这需要 9 个步骤来处理初始的.*
.
相比之下,如果正则表达式是[^1]*1.*
,则正则表达式将"1"
在一步中匹配 。
在 RegexBuddy 的调试器中,一个步骤是当正则表达式引擎匹配某些内容或匹配某些内容失败时。匹配字符的步骤由目前正则表达式匹配的所有字符表示,通常比上一步多一个字符。匹配某个位置的步骤(如单词边界)由到目前为止匹配的字符加上“ok”表示。未能匹配某些内容的步骤由到目前为止匹配的字符加上“回溯”表示。
如果单击调试器中的任何匹配字符,RegexBuddy 会选择正则表达式中与这些字符匹配的标记,并突出显示调试器中与该标记匹配的所有字符。如果您单击“确定”或“回溯”指示符,RegexBuddy 会在正则表达式中选择匹配或匹配失败的标记。
用键盘移动光标与单击具有相同的效果。按键盘上的 End 键将光标移动到步的末尾。然后按向上或向下箭头将光标移动到上一步或下一步,同时将光标保持在该步的末尾。通过以这种方式移动光标,您可以轻松地跟踪正则表达式引擎如何逐步执行您的正则表达式,以及在此过程中匹配和回溯哪些字符。
有关详细信息,请参阅 RegexBuddy 帮助文件中的这两个页面: https://www.regexbuddy.com/manual.html#debug https://www.regexbuddy.com/manual.html#benchmark