我已经更新了这个问题,因为在最初的问题中,我追逐的问题竟然是一个完全不同的错误(在这种情况下并不感兴趣)。但是我在测试中遇到的二阶错误是其他人可能遇到的问题,并以非常有趣的见解产生了答案,因此我将此处留在这里作为一个问题。
我试图找出正则表达式由于前导零而看似不匹配的问题。我发现以下所有正则表达式在我的命令行测试中都不匹配:
"005630" =~ /^0056(10|11|15|20|21|25|30|31)$/
"005630" =~ /0056(10|11|15|20|21|25|30|31)/
"005630" =~ /56(10|11|15|20|21|25|30|31)/
"005630" =~ /..56(10|11|15|20|21|25|30|31)/
"005630" =~ /..5630/
"005630" =~ /005630/
"005630" =~ /^005630$/
"005630" =~ /5630/
"005630" =~ /(0)*5630/
"005630" =~ /5630/g
"005630" =~ m/5630/g
这确实匹配:
"x005630" =~ /0056(10|11|15|20|21|25|30|31)/
与其他人类似,即一旦我添加了一封主要信件,它就有效。
测试代码(在Cygwin bash上使用Cygwin Perl v5.10.1测试):
perl -e "print ( "005630" =~ /0056(10|11|15|20|21|25|30|31)/)" # does not display a true value
perl -e "print ( "x005630" =~ /0056(10|11|15|20|21|25|30|31)/)" # displays a true value
这里引用显然是一个错误(不能在引用"
的字符串中使用未转义的"
)。但我仍然不明白为什么尽管报价不正确,第二行仍然有效。
注意:在没有正则表达式的其他情况下也可能发生这种情况。
答案 0 :(得分:10)
给出命令的原因
perl -e "print ( "005630" =~ /0056(10|11|15|20|21|25|30|31)/)"
perl -e "print ( "x005630" =~ /0056(10|11|15|20|21|25|30|31)/)"
仅第二行打印匹配是Perl支持octal numeric literals。正如你所知,你的shell正在吃引号,所以你实际上正在执行语句:
print ( 005630 =~ /0056(10|11|15|20|21|25|30|31)/);
print ( x005630 =~ /0056(10|11|15|20|21|25|30|31)/);
任何以零点开头的数字文字(不带引号的数字)都不会立即跟随小数点。将被视为八进制数。
perl -e "print 005630 . ''" # prints 2968
perl -e "print x005630 . ''" # prints x005630
(这里需要. ''
以确保将裸字视为字符串。=~
运算符在您的示例中执行此操作。)
所以你的正则表达式不匹配的原因是你的字符串不包含你的想法。