Perl正则表达式中\ 1和$ 1之间有什么区别?

时间:2009-07-01 12:19:43

标签: regex perl

与1相比,有什么不同,或者在任何情况下都可以互换。

示例:

s/([a-z]+),afklol/$1,bck/;
#against
s/([a-z]+),afklol/\1,bck/;

他们都给出了相同的结果但是有什么不同吗?

3 个答案:

答案 0 :(得分:16)

直接来自perldoc perlre

  

警告\ 1 vs $ 1

     

有些人过于习惯写作   比如:

$pattern =~ s/(\W)/\\\1/g;
     

这对于a的RHS来说是有益的   替代,以避免震惊sed   上瘾者,但这是一个肮脏的习惯   成。那是因为在PerlThink中,   “s ///”的右侧是一个   双引号。中的“\ 1”   通常的双引号字符串表示a   控制-A。惯用的Unix意思   为“s ///”插入“\ 1”。   但是,如果你养成了习惯   这样做,你自己进入   麻烦,如果你再添加一个“/ e”   改性剂。

s/(\d+)/ \1 + 1 /eg;        # causes warning under -w
     

或者如果您尝试

s/(\d+)/\1000/;
     

你说不能消除歧义   “{1} 000”,而你可以修复它   “$ {1} 000”。的运作   插值不应该混淆   与匹配的操作   反向引用。

     

当然,他们的意思是两种不同   “s ///”。

左侧的东西

答案 1 :(得分:10)

我只在极少数情况下使用\1,我需要匹配包含重复模式的早期部分。 e.g。

/(foo|bar)baz\1/

这将匹配“foobazfoo”或“barbazbar”而不是“foobazbar”。你不能在那里使用$1

在所有其他情况下,我使用$1和亲属,因为使用其他符号的问题太多了。有关所有血腥的详细信息,请参阅perlre

答案 2 :(得分:1)

它们给出了相同的结果,但是$ 1保留了它的值,而\ 1则没有。试试这个:

s/([a-z]+),afklol/$1,bck/;
print "\$1 is $1\n";
#against
s/([a-z]+),afklol/\1,bck/;
print "\\1 is \1\n";