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

Pav*_*mar 1 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";
}
Run Code Online (Sandbox Code Playgroud)

我了解到第一次出现的逗号应该匹配.但这里最后一次出现的情况是匹配的.我得到的输出是:

VP KDC T. 20, pgcet. 5, Ch. 415
 Refs %50 Annos
Run Code Online (Sandbox Code Playgroud)

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

def*_*ale 6

来自docs:

默认情况下,量化的子模式是"贪婪的",也就是说,它将匹配尽可能多的次数(给定一个特定的起始位置),同时仍然允许模式的其余部分匹配

所以,首先(.*)要尽可能多.

简单的解决方法是使用非贪婪的量词:*?.或者不匹配每个角色,但除了逗号之外的所有角色:([^,]*).

  • `[^,]*`比`.*?`更强大,我会用`[^,]*`. (8认同)