Regex Perl正则表达式中的\1和$1有什么区别?
与$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///”的
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之外不是反向引用。(它实际上是什么取决于上下文。)