Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的vim零宽度正后向查找存储反向引用?_Vim_Backreference_Regex Lookarounds - Fatal编程技术网

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

为什么我的vim零宽度正后向查找存储反向引用?,vim,backreference,regex-lookarounds,Vim,Backreference,Regex Lookarounds,我正在使用Vim,我有以下代码: print "Number 1 = $no1\n"; print "Number 2 = $no2\n"; 当我应用以下替换命令时 $s/.*\(\d\\n\)\@<=\(";\)/\1 当我替换为backreference\2时 $s/.*\(\d\\n\)\@<=\(";\)/\2 我认为我在正则表达式中只有一个反向引用(“;”),存储在\1中的似乎是我在零宽度正查找中使用的正则表达式,我认为它不会存储在反向引用中 我弄错了吗?当您应用以下

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

print "Number 1 = $no1\n";
print "Number 2 = $no2\n";
当我应用以下替换命令时

$s/.*\(\d\\n\)\@<=\(";\)/\1
当我替换为backreference\2时

$s/.*\(\d\\n\)\@<=\(";\)/\2
我认为我在正则表达式中只有一个反向引用(“;”),存储在\1中的似乎是我在零宽度正查找中使用的正则表达式,我认为它不会存储在反向引用中


我弄错了吗?

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

:%s/.*\(\d\\n\)\@<=\(";\)/\1
正如所料,因为您已在
\1
捕获组中捕获了以下表达式:

\(\d\\n\)
\(";\)
…当您替换为backreference
\2

:%s/.*\(\d\\n\)\@<=\(";\)/\2
正如预期的那样,因为您在第二个捕获组中捕获了以下表达式:

\(\d\\n\)
\(";\)
我不清楚您想做什么。您希望从上述替换中得到什么样的输出?

我认为
\(
始终是一个捕获回引用。从几次尝试中我可以看到,您想要的是一个
\%(
,这是一个非捕获回引用

因此,基本上,将你的替代品改写为:

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

我想他想要的是在不增加回溯成本的情况下回溯参考
\1
,而不是
\2

。谢谢:)尽管如此,我也不明白他试图通过替换实现什么,但这与他的问题有点无关:)谢谢,我的印象是用一个()小组不会增加反向引用的数量;这会把事情弄清楚!至于我试图实现的目标是什么,我只是不明白反向引用到底发生了什么。谢谢!我不知道有一个不捕获的反向引用;这正是我所需要的!
\(";\)
$s/.*\%(\d\\n\)\@<=\(";\)/\1
";