如何写一组代理(la-> lb),(lb-> lc),(lc-> la)作为正则表达式

new*_*ser 1 regex vim substitution

我需要在vim(MacVim)中使用它并在一行中使用它.

z.a2 = cross(zb,zc)(z.b1,z.c1);

成为

z.b2 = cross(zc,za)(z.c1,z.a1);

谢谢你

DrA*_*rAl 7

你可以使用字典:

:let replacements = {'a': 'b', 'b': 'c', 'c': 'a'}
:s/[abc]r\@!/\=replacements[submatch(0)]/g
Run Code Online (Sandbox Code Playgroud)

所述r\@!的防止ccross被改变.

如果你想在整个文件而不是当前行上添加一个%前面的s.请注意,这将改变该行上的任何"a","b"或"c",包括单词中的那些(例如cin cross).要限制这个问题,可以换着花样来\<[abc]\>,但如果你有一个会不匹配a2,所以建议:\<\([abc]\)\d*\>(和更换submatch(0)submatch(1).如果你只是想匹配,你必须在z前面的,这很容易:

:let replacements = {'a': 'b', 'b': 'c', 'c': 'a'}
:s/z\.\zs[abc]/\=replacements[submatch(0)]/g
Run Code Online (Sandbox Code Playgroud)

看到:

:help Dictionary
:help :substitute
:help :s\=
:help \@!
:help \zs
:help \(\)
:help \<
Run Code Online (Sandbox Code Playgroud)