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

时间:2010-10-28 07:41:05

标签: regex vim substitution

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

z.a2=cross(z.b, z.c)(z.b1, z.c1);

成为下线:

z.b2=cross(z.c, z.a)(z.c1, z.a1);

3 个答案:

答案 0 :(得分:7)

你可以使用字典:

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

r\@!会阻止c更改cross

如果您想在整个文件而不是当前行上添加%,请在s前面添加c。请注意,这会改变该行上的任何“a”,“b”或“c”,包括单词中的那些(例如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 的位置,这很容易:

:help Dictionary
:help :substitute
:help :s\=
:help \@!
:help \zs
:help \(\)
:help \<

请参阅:

{{1}}

答案 1 :(得分:0)

这个单线程怎么样?

%s/\.a/*b*/g | %s/\.b/*c*/g | %s/\.c/*a*/g | %s/\*a\*/.a/g | %s/\*b\*/.b/g | %s/\*c\*/.c/g

答案 2 :(得分:0)

搜索:z\.(a)(2)=cross\(z\.(b), (z\.c)\)\(z\.b(1), (z\.c1)\);

替换为:z.$3$2=cross($4, z.$1)($6, z.$1$5);