有人可以解释为什么我的匹配表现不同,无论交替是否包含在捕获组中?
这可能是由于Perl的旧版本(遗憾的是我无法控制),还是我误解了什么?我的理解是括号是某些人的约定,但在这种情况下则不需要。
[~]$ perl -v
This is perl, v5.6.1 built for PA-RISC1.1-thread-multi
(with 1 registered patch, see perl -V for more detail)
Copyright 1987-2001, Larry Wall
Binary build 633 provided by ActiveState Corp. http://www.ActiveState.com
Built 12:17:09 Jun 24 2002
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using `man perl' or `perldoc perl'. If you have access to the
Internet, point your browser at http://www.perl.com/, the Perl Home Page.
[~]$ perl -e 'print "match\n" if ("getnew" =~ /^get|put|remove$/);'
match
[~]$ perl -e 'print "match\n" if ("getnew" =~ /^(get|put|remove)$/);'
[~]$
答案 0 :(得分:6)
^get|put|remove$
找到^get
或put
或remove$
。因此,“getnew”匹配模式,因为它以get
开头。
^(get|put|remove)$
找到^get$
或^put$
或^remove$
。
答案 1 :(得分:2)
按照设计,"或"如果|
括在括号中,它将被隔离到捕获组。
第二个正则表达式在3个单词周围使用括号,因此它与传递属性相当:
if ("getnew" =~ /^get$/ || "getnew" =~ /^put$/ || "getnew" =~ /^remove$/) {
print "match\n" ;
}
但是,第一个正则表达式没有括号,所以"或"影响整个表达,包括边界条件。它匹配,因为第一个测试/^get/
成功:
if ("getnew" =~ /^get/ || "getnew" =~ /put/ || "getnew" =~ /remove$/) {
print "match\n" ;
}