Vim任何被自己替换的角色

时间:2016-08-13 22:23:20

标签: regex vim

在Vim中,搜索和替换命令到以下段:

b

将其转换为:

func {print("touching curly braces")}

到目前为止,我有:

func { print("touching curly brace") }

但是,它会对第一段进行此操作:

:%s/{.\( \)\@!/{./g

我相信我需要这样的东西:

func {.rint("touching curly braces")}

如何更换kleene明星'。'与它匹配的角色?

3 个答案:

答案 0 :(得分:1)

我替换

<style>
.carousel .item {
  height: 400px;
}

.item img {
    position: absolute;
    top: 0;
    left: 0;
    min-height: 300px;
}
</style>

:%s/{\($| \)\@!/{ /g

其中:%s/\(^| \)\@<!}/ }/g {\($| \)\@!negative lookahead为行尾或空格,另一个表达类似于negative lookbehind{

请注意,替换像这样的源代码是一项危险的工作。你可以很容易地破坏事物。想想字符串中的花括号,或正则表达式中的花括号,或其他您没想过的情况。使用}代替/gc手动确认每次更改。

答案 1 :(得分:1)

您需要将.放入一个组中,以便您可以在替换字符串中重复\(.\)

:%s/{\(.\)\( \)\@!/{ \1/g
:%s/}\(.\)\( \)\@!/} \1/g

这就是所谓的反向引用分组

如果您想同时执行两个空格,请执行以下命令:

:%s/{\(\S.*\S\)}/{ \1 }/g

答案 2 :(得分:1)

你是说这个意思吗?我希望我理解你的问题:

s/\zs{\ze./& /g
s/.\zs}\ze/ &/g

你也可以这样做:

s/{\ze./& /g
s/.\zs}/ &/g