Regex Vim:如何替换字符串的多个实例,但仅替换该字符串中的某些分隔符

Regex Vim:如何替换字符串的多个实例,但仅替换该字符串中的某些分隔符,regex,vim,Regex,Vim,这是一个正则表达式问题。在这个特殊的例子中,我使用Vim来做这项工作,但是我对正则表达式部分的一般答案感兴趣,因为我使用的是其他种类的正则表达式 考虑以下示例,我想用其他文本cd替换任意文本字符串ab,但前提是它出现在单词开始和结束之间: Before: ab ab ab START ab ab ab END ab ab ab I would like this to become: ab ab ab START cd cd cd END ab ab ab 在我要替换的字符串ab的出现之

这是一个正则表达式问题。在这个特殊的例子中,我使用Vim来做这项工作,但是我对正则表达式部分的一般答案感兴趣,因为我使用的是其他种类的正则表达式

考虑以下示例,我想用其他文本cd替换任意文本字符串ab,但前提是它出现在单词开始和结束之间:

Before:
 ab ab ab START ab ab ab END ab ab ab

I would like this to become:
 ab ab ab START cd cd cd END ab ab ab
在我要替换的字符串ab的出现之间可能有其他单词/文本。不知道字符串ab在开始之前、开始和结束之间以及结束之后出现了多少次。它可能根本不会出现

我不希望在开始和结束分隔符处拆分每一行,只在该行上执行全局s/ab/cd/g,然后重新加入这些行。是否有只与分隔符之间的ab匹配的正则表达式

:%s/START\zs.*\zeEND/\=substitute(submatch(0), 'ab', 'cd', 'g')/
\zs和\ze是零宽度,不匹配任何内容。它们简单地表示比赛的开始和结束。 \=允许我们使用:s命令中:h函数列表中的任何表达式和函数。 submatch0包含我们刚刚匹配的字符串。 然后我们用cd替换所有出现的ab。 这是一种标准模式,可以用在很多方面

帮助:


在正则表达式的可能性中,可以在可视块选择中使用替换选择要替换的块,然后:

:'<,'>s/\%Vab/cd/g
解释

'<,'> ............. refers to the visual block
s/ ................ substitution
\%V ............... that's the trick, it restricts the substitution
ab ................ old pattern
cd ................ new pattern
g  ................ globally

有关更多信息,请参见::h/\%V

您尝试过什么吗?这个regexp应该执行基本的。。。但我不知道维姆/START.*?ab.*?END/您也可以使用肯定的look-behind\@来提高替换的可读性和键入性。我建议您切换分隔符并使用非常神奇的方法,如:%s、\vSTART.*@我不久前阅读了这个问题的答案,但忽略了表达我的感谢。非常感谢。这是有用的信息!我的印象是V将作用于整条线路,包括视觉块区域之前/之后的同一线路的部分,但我现在发现我错了。我忽略了投票,尽管我发现它很有用,所以我现在这样做相当晚。抱歉,我不经常登录到堆栈溢出。谢谢
'<,'> ............. refers to the visual block
s/ ................ substitution
\%V ............... that's the trick, it restricts the substitution
ab ................ old pattern
cd ................ new pattern
g  ................ globally