在这个正则表达式
$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如何处理行.
归档时间: |
|
查看次数: |
576 次 |
最近记录: |