问题
I have a list of words:
bau
ceu
diu
fou
gau
I want to turn that list into:
byau
cyeu
dyiu
fyou
gyau
I unsuccessfully tried the command:
:%s/(\w)(\w\w)/\1y\2/g
Given that this doesn't work, what do I have to change to make the regex capture groups work in Vim?
回答1:
One way to fix this is by ensuring the pattern is enclosed by escaped parentheses:
:%s/\(\w\)\(\w\w\)/\1y\2/g
Slightly shorter (and more magic-al) is to use \v, meaning that in the pattern after it all ASCII characters except '0'-'9', 'a'-'z', 'A'-'Z' and '_' have a special meaning:
:%s/\v(\w)(\w\w)/\1y\2/g
See:
- :help \(
- :help \v
回答2:
If you don't want to escape the capturing groups with backslashes (this is what you've missed), prepend \v to turn Vim's regular expression engine into very magic mode:
:%s/\v(\w)(\w\w)/\1y\2/g
回答3:
You can also use this pattern which is shorter:
:%s/^./&y
%sapplies the pattern to the whole file.^.matches the first character of the line.&yadds theyafter the pattern.
回答4:
You also have to escape the Grouping paranthesis:
:%s/\(\w\)\(\w\w\)/\1y\2/g
That does the trick.
来源:https://stackoverflow.com/questions/19902089/vim-regex-capture-groups-bau-byau-ceu-cyeu