我需要在vim(MacVim)中完成并在一行中使用它。 (z.b,z.c)(z.b1,z.c1); z.a2 =交叉(z.b,z.c)(z.b2,z.c1);如何以正则表达式写一组(al-> lb),(al-> la)作为正则表达式
成为
z.b2 =交叉(z.c,z.a)(z.c1,z.a1);
感谢哟
我需要在vim(MacVim)中完成并在一行中使用它。 (z.b,z.c)(z.b1,z.c1); z.a2 =交叉(z.b,z.c)(z.b2,z.c1);如何以正则表达式写一组(al-> lb),(al-> la)作为正则表达式
成为
z.b2 =交叉(z.c,z.a)(z.c1,z.a1);
感谢哟
你可以使用字典:
:let replacements = {'a': 'b', 'b': 'c', 'c': 'a'}
:s/[abc]r\@!/\=replacements[submatch(0)]/g
的r\@!
防止cross
的c
被改变。
在s
前面添加%
如果您想要在整个文件而不仅仅是当前行上执行此操作。请注意,这会更改线上的任何'a','b'或'c',包括文字中的那些(例如,c
的cross
)。为了限制这种情况,你可以将模式更改为\<[abc]\>
,但是这将不符合你有a2
的地方,所以建议:\<\([abc]\)\d*\>
(并用submatch(1)
代替submatch(0)
。如果你只想匹配前面的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 \<
这个怎么样班轮
%s/\.a/*b*/g | %s/\.b/*c*/g | %s/\.c/*a*/g | %s/\*a\*/.a/g | %s/\*b\*/.b/g | %s/\*c\*/.c/g
搜索:z\.(a)(2)=cross\(z\.(b), (z\.c)\)\(z\.b(1), (z\.c1)\);
替换为:z.$3$2=cross($4, z.$1)($6, z.$1$5);
的'r \ @<'应该只是'r \ @',并在银VIM徽章恭喜!! – 2010-10-29 06:49:26
啊,是的,好点:我会纠正它(并感谢恭喜!) – DrAl 2010-10-29 06:52:49