为什么我的vim零宽度正向背后存储反向引用?

时间:2013-02-26 02:21:29

标签: vim backreference regex-lookarounds

我正在使用Vim,我有以下代码:

print "Number 1 = $no1\n";
print "Number 2 = $no2\n";

当我应用以下替代命令

$s/.*\(\d\\n\)\@<=\(";\)/\1

结果是

1\n
2\n

当我用backreference \ 2代替

$s/.*\(\d\\n\)\@<=\(";\)/\2

结果是

";
";

我认为我在正则表达式中只有一个反向引用(“;”存储在\ 1中的内容似乎是我在零宽度正向后观察中使用的正则表达式,我认为它不会存储在反向引用中

我错了吗?

2 个答案:

答案 0 :(得分:2)

我认为\(始终是一个捕获参考。从我几次尝试中可以看出,你想要的是一个\%(,这是一个非捕获后退参考。

所以基本上,将你的替补改写为:

$s/.*\%(\d\\n\)\@<=\(";\)/\1

将放

";

反向引用\1,而不是\2

答案 1 :(得分:0)

应用以下替换命令时:

:%s/.*\(\d\\n\)\@<=\(";\)/\1

......结果是:

1\n
2\n

正如所料,因为您已在\1捕获组中捕获了以下表达式:

\(\d\\n\)

...当您使用反向引用代替\2

:%s/.*\(\d\\n\)\@<=\(";\)/\2

......结果是:

";
";

正如所料,因为您已在第二个捕获组中捕获了以下表达式:

\(";\)

我不清楚你要做什么。您对上述替换的期望是什么?