Regex 当调试打开时,您如何理解re.pm的输出? [root@test]#perl-e'使用重新“调试”;“a”=~/.*/'; 编译REx`.*' 大小3为偏移量批注获取了28个字节。 2点开始 1:星(3) 2:REG_ANY(0) 3:完(0) 锚定(MBOL)隐式最小值0 抵销:[3] 2[1] 1[1] 3[0] 匹配REx“*”和“a” 设置评估范围,savestack=3 0 | 1:星 REG_ANY可以匹配2147483647中的1次。。。 设置评估范围,savestack=3 1 | 3:结束 比赛成功! 释放雷克斯:`.*''`
任何人都可以解释这一点?输出有两个重要部分:模式编译和运行时匹配 第一部分描述了已编译自动机中的节点,其中有三个节点Regex 当调试打开时,您如何理解re.pm的输出? [root@test]#perl-e'使用重新“调试”;“a”=~/.*/'; 编译REx`.*' 大小3为偏移量批注获取了28个字节。 2点开始 1:星(3) 2:REG_ANY(0) 3:完(0) 锚定(MBOL)隐式最小值0 抵销:[3] 2[1] 1[1] 3[0] 匹配REx“*”和“a” 设置评估范围,savestack=3 0 | 1:星 REG_ANY可以匹配2147483647中的1次。。。 设置评估范围,savestack=3 1 | 3:结束 比赛成功! 释放雷克斯:`.*''`,regex,perl,Regex,Perl,任何人都可以解释这一点?输出有两个重要部分:模式编译和运行时匹配 第一部分描述了已编译自动机中的节点,其中有三个节点 STAR(n)匹配以下节点中的零个或多个,并继续通过节点n REG\u ANY匹配除换行符以外的任何字符(即/./) END标记自动机的结束状态 MBOL以多行匹配模式匹配行的开头,即/^/m。这是由于模式开头的*而隐含的。(请记住:默认情况下,正则表达式量词是贪婪的。) 与模式匹配的字符串的最小长度为零,或者为空字符串。(记住:*量词总是成功的!) 偏移量的形式如下所示 [
匹配以下节点中的零个或多个,并继续通过节点nSTAR(n)
匹配除换行符以外的任何字符(即REG\u ANY
)/./
标记自动机的结束状态END
MBOL
以多行匹配模式匹配行的开头,即/^/m
。这是由于模式开头的*
而隐含的。(请记住:默认情况下,正则表达式量词是贪婪的。)
与模式匹配的字符串的最小长度为零,或者为空字符串。(记住:*
量词总是成功的!)
偏移量的形式如下所示
[root@ test]# perl -e 'use re "debug";"a" =~ /.*/';
Compiling REx `.*'
size 3 Got 28 bytes for offset annotations.
first at 2
1: STAR(3)
2: REG_ANY(0)
3: END(0)
anchored(MBOL) implicit minlen 0
Offsets: [3]
2[1] 1[1] 3[0]
Matching REx ".*" against "a"
Setting an EVAL scope, savestack=3
0 <> <a> | 1: STAR
REG_ANY can match 1 times out of 2147483647...
Setting an EVAL scope, savestack=3
1 <a> <> | 3: END
Match successful!
Freeing REx: `".*"'`
并将节点链接到程序中的正则表达式。在您的例子中,*
(节点2和1)从模式中的第一个位置开始,而结束状态隐式地在那里。偏移量对于正则表达式调试器非常方便,例如,突出显示当前正在尝试匹配的子模式
现在它已经编译好了,可以进行匹配,后面的部分跟踪执行情况。说明了描述匹配进度的行的形式:
每个步骤的形式为n
,其中
字符串的匹配部分和
尚未匹配的部分
问题中的匹配以未使用文本开始,然后*
匹配a
,模式匹配成功
评估范围是与您不使用的机器相关的机器
提供了更多的背景信息,并一如既往地使用源代码Luke 似乎我们能从输出中得到的唯一东西是正则表达式是从最右边解释的。还有什么有用的吗?
NODENUM:POSITION[LENGTH]