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

Regex Perl正则表达式中的\1和$1有什么区别?,regex,perl,Regex,Perl,与$1(如果有的话)相比,使用\1有什么区别,或者它们在所有情况下都是可互换的 例如: s/([a-z]+),afklol/$1,bck/; #against s/([a-z]+),afklol/\1,bck/; 它们都给出了相同的结果,但有什么不同吗?直接来自: \1对$1的警告 有些人太习惯写作了 例如: $pattern =~ s/(\W)/\\\1/g; 这是为一家公司的RHS设计的 替换以避免震惊sed 上瘾,但这是一个肮脏的习惯 进入那是因为在PerlThink, “s///”的

与$1(如果有的话)相比,使用\1有什么区别,或者它们在所有情况下都是可互换的

例如:

s/([a-z]+),afklol/$1,bck/;
#against
s/([a-z]+),afklol/\1,bck/;
它们都给出了相同的结果,但有什么不同吗?

直接来自:

\1对$1的警告

有些人太习惯写作了 例如:

$pattern =~ s/(\W)/\\\1/g;
这是为一家公司的RHS设计的 替换以避免震惊sed 上瘾,但这是一个肮脏的习惯 进入那是因为在PerlThink, “s///”的右侧是 双引号字符串。中的“\1” 通常双引号字符串表示 control-A.惯用的Unix含义 “s//”的“\1”中包含了。 然而,如果你养成了 这样做,你就会陷入困境 如果随后添加“/e”,则会出现问题 修饰语

s/(\d+)/ \1 + 1 /eg;        # causes warning under -w
或者如果你想这么做

s/(\d+)/\1000/;
你不能这样说来消除歧义 “{1}000”,而您可以使用 "${1}000". 操作 不应混淆插值 通过匹配 反向参考

当然,它们的意思是两种不同的 “s///”左侧的内容


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

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

/(foo|bar)baz\1/
这将匹配“foobazfoo”或“barbazbar”,但不匹配“foobazbar”。您不能在那里使用
$1


在所有其他情况下,我使用
$1
和kin,因为使用其他符号有太多的gotcha。查看所有血淋淋的细节。

当我看到这个问题时,我想知道的是:它们都可以用于反向引用吗?这是因为m//或s//\1之外不是反向引用。(它实际上是什么取决于上下文。)