我正在使用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中的内容似乎是我在零宽度正向后观察中使用的正则表达式,我认为它不会存储在反向引用中
我错了吗?
答案 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
......结果是:
";
";
正如所料,因为您已在第二个捕获组中捕获了以下表达式:
\(";\)
我不清楚你要做什么。您对上述替换的期望是什么?