繁体   English   中英

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

[英]What is the difference between \1 and $1 in a Perl regex?

如果有的话,与1相比有什么不同,或者在所有情况下它们是否可以互换。

例:

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

他们都给出了相同的结果,但有什么区别吗?

直接来自perldoc perlre

警告\\ 1对1美元

有些人习惯于写下这样的东西:

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

这对于RHS来说是一个替代品,以避免震惊sed上瘾者,但这是一个肮脏的习惯。 那是因为在PerlThink中,“s ///”的右侧是双引号字符串。 通常的双引号字符串中的“\\ 1”表示对照-A。 “/ 1”的惯用Unix含义是“s ///”。 但是,如果你习惯这样做,那么如果你添加一个“/ e”修饰符就会让自己陷入困境。

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

或者如果你试图这样做

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

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

当然,它们意味着“s ///”左侧有两个不同的东西。

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

/(foo|bar)baz\1/

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

在所有其他情况下,我使用$1和亲属,因为使用其他表示法的问题太多了。 有关所有血腥细节,请参阅perlre

它们给出了相同的结果,但是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";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM