为什么这个正则表达式不贪心?

Jos*_*ein 9 regex perl

在这个正则表达式

$line = 'this is a regular expression';
$line =~  s/^(\w+)\b(.*)\b(\w+)$/$3 $2 $1/;

print $line;
Run Code Online (Sandbox Code Playgroud)

为什么2美元等于" is a regular "?我的思维过程是(.*)应该贪婪并匹配所有字符,直到行结束,因此$ 3将为空.

但这并没有发生.正则表达式匹配器以某种方式在最后一个单词边界之前停止,并在最后一个单词边界之后填充$ 3,并将其余字符串发送到$ 2.

任何解释?谢谢.

ver*_*ald 15

$3使用此正则表达式时不能为空,因为相应的捕获组(\w+)必须匹配至少一个单词字符,否则整个匹配将失败.

所以会发生什么是(.*)匹配" is a regular expression",\b匹配字符串的结尾,并且(\w+)无法匹配.然后正则表达式引擎回溯到(.*)匹配" is a regular "(注意匹配包括空格),\b匹配之前的单词边界e,并(\w+)匹配" expression".

如果你(\w+)改为(\w*)那么你将得到你期望的结果,(.*)消耗整个字符串.


Dan*_*zer 6

贪婪并不意味着它绝对匹配所有东西.它只是意味着它可以尽可能多地使用并仍然使正则表达式成功.

这意味着,由于您使用+在第3组不能为空,仍然成功,因为+意味着1个或多个.

如果您想要3为空,只需更改(\w+)(\w?).现在,因为?意味着0或1,它可以是空的,因此贪婪.*占据了一切.注意:这似乎仅适用于Perl,因为perl如何处理行.