为什么我的非贪婪Perl正则表达式什么都不匹配?

sun*_*ica 4 regex perl greedy regex-greedy

我以为我在合理的范围内理解了Perl RE,但这令我感到困惑:

#!/usr/bin/perl
use strict;
use warnings;

my $test = "'some random string'";

if($test =~ /\'?(.*?)\'?/) {
       print "Captured $1\n";
       print "Matched $&";
}
else {
       print "What?!!";
}
Run Code Online (Sandbox Code Playgroud)

版画

捕获的
匹配'

它似乎与"结局"相匹配,因此没有任何结果.
我本来期望它与整个事物相匹配,或者如果它完全不贪婪,什么都没有(因为一切都有可选匹配).
这种行为让我感到困惑,任何人都可以解释发生了什么?

Sim*_*son 14

所述\'?在开始和结束是指匹配0或1撇号贪婪地.(正如另一张海报指出的那样,为了使它不贪婪,它必须是\'??)

.*?中间装置匹配0个或多个字符的非贪婪地.

Perl正则表达式引擎将查看字符串的第一部分.它将匹配开头,但是贪婪地这样做,所以它拿起了第一个撇号.然后它匹配非贪婪(所以尽可能少),然后是可选的撇号.这与空字符串匹配.

  • 换句话说,只有*beginning*撇号匹配,其余的正则表达式匹配空字符串. (2认同)