正则表达式内外的反斜杠,$ 1 vs \ 1

时间:2014-10-21 11:38:38

标签: regex perl

我在Perl中看到了一些奇怪的分组行为。

以下是我的文件摘录:

nmos MNANT2(sam_1_,sam_1_,sam_1_);  
nmos MNANT1(sam[0],sam[0],sam[0]);  
nmos MNANT3(ovstb,ovstb,ovstb);
nmos M3(net14, VSS, in);  

基本上我正在尝试匹配这些行,其中括号内的所有3个字段都相同。

尝试使用以下一个衬垫:

perl -nle 'm/(.+?\((.+?),$2,$2\).+)/ && print $1' new

它没有用,但下面的人工作正常:

perl -nle 'm/(.+?\((.+?),\2,\2\).+)/ && print $1' new

所以,我怀疑为什么$ 2没有工作,\ 2在这里运作良好? 我们不应该使用" $"对于反向引用,因为我最后使用了1美元?

而且,好的,如果" \"在任何地方都可以正常工作,我只是尝试放置\ 1,而不是像下面那样的$ 1:

perl -nle 'm/(.+?\((.+?),\2,\2\).+)/ && print \1' new

它返回以下错误:

SCALAR(0x1a49678)
SCALAR(0x1a49678)
SCALAR(0x1a49678)

我在这里从根本上缺少什么?期待专家们的了解。

2 个答案:

答案 0 :(得分:2)

您似乎认为正则表达式模式和Perl代码是相同的语言。正则表达式模式中的a+b不是加法,正则表达式之外的\2不是匹配第二次捕获的指令。


perl -nle 'm/(.+?\((.+?),$2,$2\).+)/ && print $1' new不起作用,因为在模式被编译之前$2被插入到模式中。

perl -nle 'm/(.+?\((.+?),\2,\2\).+)/ && print $1' new有效,因为正则表达式原子\2的意思是“匹配第二次捕获的内容。”

perl -nle 'm/(.+?\((.+?),\2,\2\).+)/ && print \1' new不起作用,因为\是Perl的引用操作符。

答案 1 :(得分:1)

m//print命令是由&&加入的单独命令。

在正则表达式\2内是对第二次捕获的反向引用,在正则表达式完成匹配后将分配给$2变量。正则表达式之外\2没有意义;只有$2是可以访问的变量。有关详细信息,请参阅此处:http://perldoc.perl.org/perlretut.html#Backreferences

在阅读该链接时,请注意在Perl 5.10 \2仍被识别后,但鼓励\g2。这是因为\11含糊不清。