Regex 如何在vim视觉模式下搜索/替换第n个事件?
这项工作:Regex 如何在vim视觉模式下搜索/替换第n个事件?,regex,vim,Regex,Vim,这项工作: '<,'>s/\v\/\zs(\/)// '<,'>s/\v(\/)@<=\//BAR/ 我如何替换第四个“foo” foo foo foo foo foo foo foo foo foo foo foo foo foo foo 为了简单起见,我将讨论匹配这些模式,在替换命令中替换它们应该同样有效,在:s命令中使用相同的模式 替换第三个正斜杠“/” /dir1//fas//fooBar/¬ /dir2//\.foobar//fas/¬ /dir//
'<,'>s/\v\/\zs(\/)//
'<,'>s/\v(\/)@<=\//BAR/
我如何替换第四个“foo”
foo foo foo foo foo foo foo
foo foo foo foo foo foo foo
为了简单起见,我将讨论匹配这些模式,在替换命令中替换它们应该同样有效,在
:s
命令中使用相同的模式
替换第三个正斜杠“/”
/dir1//fas//fooBar/¬
/dir2//\.foobar//fas/¬
/dir//.foo//fas/¬
使用单字符匹配更容易,因为您可以使用[^/]
查找不属于匹配的字符
如果要计算匹配项,需要从行的开头开始,因此使用^
锚定
此时,您可以匹配两个“非斜杠”实例,后跟一个“斜杠”,然后在第三个实例上,您可以使用\zs
将其标记为实际匹配的开始
有点遗憾的是,如果我们在匹配中使用它,/
本身将需要使用\/
进行转义,但结果模式是:
/\v^%([^\/]*\/){2}[^\/]*\zs\/
对于包含/
的模式,一个常见提示是使用?
反向搜索,因此让我们这样做以提高可读性:
?\v^%([^/]*/){2}[^/]*\zs/
有些人可能不熟悉我在这里使用的模式项有:
- :将模式分组,与
相同,但不创建捕获组(…)
- :与前面的模式完全匹配两次
\zs
,那么最后一个要匹配的将是定义匹配实际开始的位置。(见附件。)
因此,我们可以将其简化为:
?\v^%([^/]*\zs/){3}
我们将“非斜杠”和“斜杠”匹配三次。\zs
仅在最后一次(第三次)匹配时生效,因此您将最终匹配行上的第三个斜杠
现在,让我们转到更复杂的匹配单词的情况:
我如何替换第四个“foo”
这里我们不能使用[^…]
来匹配“notfoo”。我的意思是,我们可以使用类似于\v([^f]|f[^o]|fo[^o])
的东西,但它会随着您匹配的单词的增长而快速增长。还有更好的方法
我们可以使用零宽度负片向后看!有关此有趣的运算符,请参见。简而言之,它使用前面的原子(我们将在这里使用一个带有单词的组),并确保该项与该位置的结尾不匹配
所以我们可以用这个:
/\v^%(%(.%(foo)@<!)*\zsfoo){4}
这是非常通用的,您可能可以使用任何固定单词,甚至是带有一些变体的模式(例如大小写、复数、可选拼写等)谢谢您提出的有趣且具有挑战性的问题!谢谢你的帮助,回答得好。
/\v^%(%(.%(foo)@<!){-}\zsfoo){4}