在Perl正则表达式中,&符号的作用是什么?

27

大家好,我在 Perl 中有这个正则表达式,但我不理解它。

s/\w+$/($`!)$&/;

原始字符串为

"huge dinosaur"

执行正则表达式后,字符串现在变为:

"huge (huge !)dinosaur"

我不太理解那是怎么发生的。而且我也不明白那个&符号在那里做什么。我明白$`的意思,但是为什么它在那里呢?从我所知道的来看,$`取的是匹配前的值,因为在上述正则表达式之前没有匹配表达式,那么可能就是空的。

如果有人可以给我提供一些关于Perl正则表达式的非常有用的教程链接,我将不胜感激。

谢谢

编辑:现在我明白了&符号的含义,它保存了匹配,而$`保存了匹配之前的值。现在我又不明白的是这整个部分:

($`!)$&

这部分是如何变成的?

(huge !)

1
谷歌搜索 perlvar,然后查找 $&。这是一个粗略的开始。 - squiguy
s///第二个部分中的比特只是一个双引号字符串。 - brian d foy
@squiguy,这个链接 http://perldoc.perl.org/perlvar.html#%24%26 是(半)“官方”的唯一链接。 - Brad Gilbert
@BradGilbert,我在网页链接方面没有你那么熟练 :). 我试着去做了。 - squiguy
@squiguy 我只需在元素上右键单击并选择“检查元素”(在Chrome中),然后将其添加到链接中。虽然如果您知道 $(24)和 (26)的十六进制代码,您可以直接对它们进行URL转义。(仅适用于perlvar页面) - Brad Gilbert
@BradGilbert 好的,谢谢你的建议。很多人不回复评论。 - squiguy
2个回答

32

你是正确的,$`是一个特殊变量,它保持匹配前的内容。 $&类似,但是保持匹配到的内容,$' 保持匹配后的内容。

"huge dinosaur" 中,/\w+$/ 匹配到了 dinosaur。因此变量内容为:

$` => "huge "
$& => "dinosaur"
$' => ""
请注意匹配到的是dinosaur。然后将字符串中dinosaur这一部分替换为开括号、"huge "、感叹号、闭括号以及最后匹配到的dinosaur。 请查看Perl文档中关于perlvarperlre的内容。

抱歉有些龟毛,但我看到 `$`` 没有以两个空格结尾感到惊讶。这是一个错误还是我漏了什么? - Steven Lu
@StevenLu,我的错误,在原始短语中打了两个空格,抱歉!感谢您的注意。 - sidyll

17

$&(美元符号和和号)保存整个正则表达式匹配的结果。

$'(美元符号后跟单引号或撇号)保存正则表达式匹配结果后(右侧)的字符串。

$`(美元符号后跟反引号)保存正则表达式匹配结果前(左侧)的字符串。

有关更多信息,请查阅http://www.regular-expressions.info/perl.html


1
我找到了如何在代码段中包含反引号,并编辑了你的答案,希望你不介意。你必须用双反引号开始和结束代码段,在结束的反引号前留一个空格,以将字符的反引号与结束的反引号分开...令人困惑! - sidyll
是的,我不确定如何做到那一点。谢谢! - Eric S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接