2

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

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

当我应用以下替代命令时

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

结果是

1\n
2\n

当我用反向引用 \2 代替时

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

结果是

";
";

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

我弄错了吗?

4

2 回答 2

2

我认为\(始终是一个捕获的反向参考。从我从几次尝试中可以看出,你想要的是 a \%(,它是一个非捕获的反向引用。

所以基本上,将你的替代品重写为:

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

会放

";

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

于 2013-02-26T02:56:24.807 回答
0

当您应用以下替代命令时:

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

...结果是:

1\n
2\n

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

\(\d\\n\)

...当你用反向引用\2代替时

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

...结果是:

";
";

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

\(";\)

我不清楚你想做什么。您期望从上述替换中得到什么输出?

于 2013-02-26T02:55:58.920 回答