为什么看起来Perl正则表达式中的*不是贪婪的?

dre*_*ves 3 regex perl

我希望这打印,"[b]"但它打印"[]":

$x = "abc";
$x =~ /(b*)/;
print "[$1]";
Run Code Online (Sandbox Code Playgroud)

如果用加号替换星号,它就像我期望的那样.是不是加号和明星都应该贪婪?

补充:感谢大家指出(在几秒钟内,似乎!)"b*"匹配空字符串,第一次出现在字符串开始之前.所以贪婪根本不是问题.它甚至在到达第一个'b'之前匹配空字符串.

cha*_*aos 10

模式将匹配并在第一次返回时返回b*,即它将执行零宽度匹配a.为了更清楚地说明发生了什么,请执行以下操作:

$x = "zabc";
$x =~ /(.b*)/;
print "[$1]";
Run Code Online (Sandbox Code Playgroud)


Log*_*ldo 10

它很贪婪,但b*会匹配空字符串.任何*总是匹配空字符串,所以,

  "abc"
  /\
     --- matches the empty string here.
Run Code Online (Sandbox Code Playgroud)

如果你打印$'你会看到它是abc,这是匹配后的其余字符串.贪婪只是意味着在"bbb"的情况下,你得到"bbb",而不是"b"或"bb".

  • 我知道了.所以贪婪根本不是问题.它永远不会有机会贪婪地匹配b的字符串,因为它匹配字符串的最开头的空字符串,甚至在它到达b之前. (2认同)