在Perl中,
*
通常是贪婪的,除非在它后面加上?
。但是,当*
用于一个组时,情况似乎不同。我的问题是“为什么”。考虑以下示例:my $text = 'f fjfj ff';
my (@matches) = $text =~ m/((?:fj)*)/;
print "@matches\n";
# --> ""
@matches = $text =~ m/((?:fj)+)/;
print "@matches\n";
# --> "fjfj"
在第一个匹配中,Perl懒惰地什么也没有打印出来,虽然它本可以匹配到一些东西,正如第二个匹配所示。奇怪的是,当组的内容只是.
而不是实际字符时,*
的行为像预期的那样贪婪:
@matches = $text =~ m/((?:..)*)/;
print "@matches\n";
# --> 'f fjfj f'
- 注意:以上内容在Perl 5.12上进行测试。
- 注意:使用括号组内的捕获或非捕获括号都不会影响结果。