Как написать группу заменителей (la-> lb), (lb-> lc), (lc-> la) в качестве регулярного выражения - PullRequest
1 голос
/ 28 октября 2010

Мне нужно сделать это в 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 ]

7 голосов
/ 28 октября 2010

Вы можете использовать словарь:

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

r\@! предотвращает изменение c из cross.

Добавьте % перед s, если вы хотите сделать это для всего файла, а не только для текущей строки. Обратите внимание, что это изменит ЛЮБОЕ «a», «b» или «c» в строке, в том числе внутри слов (например, 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 \<
0 голосов
/ 28 октября 2010

Поиск: z\.(a)(2)=cross\(z\.(b), (z\.c)\)\(z\.b(1), (z\.c1)\);

Заменить на: z.$3$2=cross($4, z.$1)($6, z.$1$5);

0 голосов
/ 28 октября 2010

Как насчет этого однострочного?

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