Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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
Regex 如何在vim视觉模式下搜索/替换第n个事件?_Regex_Vim - Fatal编程技术网

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}