Vim正则expression式捕获组
我有一个单词列表:
bau ceu diu fou gau 我想把这个列表变成:
 byau cyeu dyiu fyou gyau 
我试过这个命令:
 :%s/(\w)(\w\w)/\1y\2/g 
为了使捕获组在Vim中工作,我需要做些什么改变?
解决这个问题的一个方法是确保模式被括号括起来:
 :%s/\(\w\)\(\w\w\)/\1y\2/g 
 稍微短一点(也就是更多的魔术 )就是使用\v ,意思是在除了'0'-'9' , 'a'-'z' , 'A'-'Z'以外'0'-'9'所有ASCII字符'_'有特殊的含义: 
 :%s/\v(\w)(\w\w)/\1y\2/g 
看到:
-  :help \(
-  :help \v
 如果你不想用反斜线(这是你错过的)来避开捕获组,那么在\v把Vim的正则expression式引擎变成非常神奇的模式: 
 :%s/\v(\w)(\w\w)/\1y\2/g 
你也可以使用这个较短的模式:
 :%s/^./&y 
-   %s将模式应用于整个文件。
-  ^.匹配该行的第一个字符。
-   &y在模式之后添加y。
你也必须逃避分组的假设:
 :%s/\(\w\)\(\w\w\)/\1y\2/g 
这就是诀窍。