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

use*_*033 10 regex perl

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

例:

s/([a-z]+),afklol/$1,bck/;
#against
s/([a-z]+),afklol/\1,bck/;
Run Code Online (Sandbox Code Playgroud)

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

小智 16

直接来自perldoc perlre:

警告\ 1对1美元

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

$pattern =~ s/(\W)/\\\1/g;
Run Code Online (Sandbox Code Playgroud)

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

s/(\d+)/ \1 + 1 /eg;        # causes warning under -w
Run Code Online (Sandbox Code Playgroud)

或者如果你试图这样做

s/(\d+)/\1000/;
Run Code Online (Sandbox Code Playgroud)

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

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


Mic*_*man 10

我只\1在罕见的情况下使用,我需要匹配包括重复模式的早期部分.例如

/(foo|bar)baz\1/
Run Code Online (Sandbox Code Playgroud)

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

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