在这个正则表达式
$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*)那么你将得到你期望的结果,(.*)消耗整个字符串.
贪婪并不意味着它绝对匹配所有东西.它只是意味着它可以尽可能多地使用并仍然使正则表达式成功.
这意味着,由于您使用+在第3组不能为空,仍然成功,因为+意味着1个或多个.
如果您想要3为空,只需更改(\w+)为(\w?).现在,因为?意味着0或1,它可以是空的,因此贪婪.*占据了一切.注意:这似乎仅适用于Perl,因为perl如何处理行.