4

我已经更新了这个问题,因为在原始问题中,我所追求的问题原来是一个完全不同的错误(在这种情况下并不有趣)。但是我在测试中犯的第二个错误是其他人可能会遇到的,并产生了一个非常有趣的见解的答案,所以我将把它留在这里作为一个问题。

我试图找出由于前导零而导致的正则表达式似乎不匹配的问题。我发现以下所有正则表达式在我的命令行测试中都不匹配:

"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

这里的引用显然是一个错误(不能"在用 引用的字符串中使用未转义")。但是我仍然不明白为什么尽管引用不正确,第二行仍然有效。

注意:这也可能发生在其他没有正则表达式的情况下。

4

1 回答 1

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 支持八进制 数字文字。正如你所知道的,你的 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

. ''此处需要确保将裸字视为字符串。=~运算符在您的示例中执行此操作。)

因此,您的正则表达式不匹配的原因是您的字符串不包含您认为的内容。

于 2012-11-22T14:39:28.180 回答