Vim Regex捕获组[bau-> byau:ceu-> cyeu]


132

我有一个单词列表:

bau
ceu
diu
fou
gau

我想把这个清单变成:

byau
cyeu
dyiu
fyou
gyau

我尝试命令失败:

:%s/(\w)(\w\w)/\1y\2/g

鉴于这行不通,为了使regex捕获组在Vim中起作用,我必须更改什么?



4
这有点题外话,所以我在这里发表评论,但……我愿意:%norm ay<CR>
romainl

2
在您的情况下(如果与所描述的完全相同),可以选择:用移至第二列,用l进入可视块模式,用Ctrl+v标记整个列,Shift+g然后用标记l,然后使用插入模式Shift+i并输入'y'。7次击键,包括结束Esc退出插入模式的操作。不要发布答案,因为它实际上与捕获组无关(这是我找到捕获组时要搜索的内容)。:-)
LAFK说恢复莫妮卡

Answers:


224

解决此问题的一种方法是确保将模式用转义括号括起来:

:%s/\(\w\)\(\w\w\)/\1y\2/g

使用会稍微短一些(并且更神奇\v,这意味着在模式之后的所有ASCII字符'0'-'9''a'-'z''A'-'Z'和除外)'_'都有特殊含义:

:%s/\v(\w)(\w\w)/\1y\2/g

看到:


41

如果您不想使用反斜杠来转义捕获组(这是您所想不到的),请\v准备将Vim的正则表达式引擎转换为非常魔术的模式:

:%s/\v(\w)(\w\w)/\1y\2/g

英戈,对不起,在错误的地方放置了一个问题:该作品找到:exmode; gvim查找/替换对话框中有没有办法做到这一点?
JJoao 2015年

3
@JJoao:不,“查找/替换”框仅用于文字搜索和替换。无论如何,您都不应该使用它。它只是记事本用户的训练轮。
Ingo Karkat,2015年

Ingo,谢谢(这对我来说不是:我对exmode感到满意,但对词典项目中的语言学家colaborator感到满意):它几乎可以工作-使用\v...regexp工作即可;在替换字符串中,&但有效但\ 受到保护(\1\r丢失)
JJoao 2015年

@JJoao:是的,这也是我在玩游戏时发现的。我仍然对在没有Ex模式的情况下使用Vim是否是一个好主意持怀疑态度,但是您可以:s通过添加inputdialog()一点Vimscript 来轻松构建自己的搜索和替换对话框(内部由供电)。
Ingo Karkat,2015年

英戈:再次谢谢你。我同意你的怀疑意见。Inputdialg +:s + vimscript可能是gvim的find replace构建方式。对我来说,\1 \r 治疗是一个gvim错误。我将尝试将其发布在一些vim特定列表中。同时,我将尝试我的一份vimscript-inputdialog。
JJoao 2015年

34

您还可以使用以下较短的模式:

:%s/^./&y
  • %s 将模式应用于整个文件。
  • ^. 与该行的第一个字符匹配。
  • &yy在模式之后添加。

13

您还必须避开分组偏执:

:%s/\(\w\)\(\w\w\)/\1y\2/g

这样就可以了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.