我已更新此问题,因为在原始问题中,我所追踪的问题实际上是一个完全不同的错误(在这个背景下不太有趣)。但我在测试中犯的第二次错误是其他人可能会遇到的,它提供了一个非常有趣的见解,因此我将其作为一个问题留在这里。
我试图追踪正则表达式似乎由于前导零而无法匹配的问题。我发现我的命令行测试中所有以下正则表达式都没有匹配成功:
"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
很明显,这里的引号使用错误(在使用双引号引用字符串时不能使用未转义的双引号)。但是,我仍然不理解为什么第二行尽管引号使用错误也能正常工作。
注意:这种情况也可能发生在没有正则表达式的其他情况下。
/^0056(?:[12][015]|3[01])$/
。 - amonperl -le 'print "ok" if "005630" =~ /^0056(10|11|15|20|21|25|30|31)$/' ; $ ok
。那一行是从你的问题中复制并粘贴的。所以也许你正在遇到 Perl 5.10.1 中的一个 bug? - Moritz Bunkusperl -e 'print ( "005630" =~ /^0056(?:[12][015]|3[01])$/)'
是有效的。 - FelixD$_
作为正则表达式模式时,可能会遇到字符解释问题。该模式是否包含任何可能被解释为特殊正则表达式字符的内容?请使用\Q$_\E
来匹配$_
的字面内容。或者更好的方法是,如果您正在进行精确匹配(似乎是这样),只需使用eq
进行比较,而不是使用正则表达式。 - dan1111