模式匹配如何在Perl中运行?

时间:2013-02-27 07:17:34

标签: regex perl pattern-matching

我想知道模式匹配在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

有人可以解释一下这种匹配是如何工作的吗?

4 个答案:

答案 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字符,直到最后一个逗号而不是第一个逗号。 所以 它匹配到最后一个命令。 第二场比赛是剩下的比赛。

?

之后避免贪婪模式匹配adda *