我想知道模式匹配在Perl中是如何工作的。
我的代码是:
my $var = "VP KDC T. 20, pgcet. 5, Ch. 415, Refs %50 Annos";
if($var =~ m/(.*)\,(.*)/sgi)
{
print "$1\n$2";
}
我了解到第一次出现的逗号应该匹配。但这里最后一次出现的情况是匹配的。我得到的输出是:
VP KDC T. 20, pgcet. 5, Ch. 415
Refs %50 Annos
有人可以解释一下这种匹配是如何工作的吗?
答案 0 :(得分:6)
来自docs:
默认情况下,量化的子模式是“贪婪的”,也就是说,它会尽可能多地匹配(给定一个特定的起始位置),同时仍然允许模式的其余部分匹配
因此,首先(.*)
将尽可能多地使用。
简单的解决方法是使用非贪婪量词:*?
。或者不是匹配每个角色,而是匹配逗号以外的所有角色:([^,]*)
。
答案 1 :(得分:4)
贪婪和不匹配
Perl正则表达式通常匹配可能的最长字符串。
例如:
my($text) = "mississippi";
$text =~ m/(i.*s)/;
print $1 . "\n";
运行上面的代码,这是你得到的:
ississ
它匹配第一个i,最后一个s以及它们之间的所有内容。但是,如果你想要将第一个i与最接近的s匹配呢?使用此代码:
my($text) = "mississippi";
$text =~ m/(i.*?s)/;
print $1 . "\n";
现在查看代码产生的内容:
is
显然,使用问号会使匹配不合适。但另一个问题是,正则表达式总是尽可能早地匹配。
来源:http://www.troubleshooters.com/codecorn/littperl/perlreg.htm
答案 2 :(得分:1)
在你的正则表达式中使用问号:
if($var =~ m/(.*?)\,(.*)/sgi)
{
print "$1\n$2";
}
所以:
答案 3 :(得分:0)
(.*)\,
- 您可能希望它匹配到第一个逗号。
但它足够贪婪,以匹配它遇到的所有x字符,直到最后一个逗号而不是第一个逗号。
所以
它匹配到最后一个命令。
第二场比赛是剩下的比赛。
在?
*