Инвертировать направление назначения в Visual Studio
У меня есть набор операций присваивания в Visual Studio, и я хочу изменить их:
то есть
i = j;
would become
j = i;
то есть. заменяя все до равных с тем, что после равных, и наоборот
Есть ли простой способ сделать это, сказать что-то в движке регулярных выражений?
Приветствия, Эд
Ответы
Ответ 1
Выберите строки, которые вы хотите поменять, Ctrl + H, затем замените:
{:i}:b*=:b*{:i};
с:
\2 = \1;
с "Look in:" установите "Selection"
Это относится только к идентификаторам стиля C/С++ (через ": i" ). Замените это следующим образом:
{.*}:b*=:b*{.*};
заменить что-либо по обе стороны от "=".
Кроме того, поскольку вы упомянули в комментарии, вы используете ReSharper, вы можете просто выделить "=", "Alt + Enter" и "Reverse assign".
Ответ 2
Просто небольшое улучшение ответа Криса...
Ctrl + H, затем замените:
{:b*}{[^:b]*}:b*=:b*{[^:b]*}:b*;
с:
\1\3 = \2;
(лучшая обработка пробелов, особенно в начале строки)
EDIT:
Для Visual Studio 2012 и выше (я пробовал это в 2015 году):
Заменить
(\s*)([^\s]+)\s*=\s*([^\s]+)\s*;
с:
$1$3 = $2;
Ответ 3
К сожалению, у меня нет Visual Studio, поэтому я не могу попробовать в целевой среде, но если он использует стандартные регулярные выражения, вы, вероятно, можете сделать это следующим образом:
Найдите "(:Al) = (:Al);
" и замените на "\2 = \1
". (\ 1 и \2 являются ссылками на первую и вторую группы захвата, в этом случае скобки вокруг \w: s)
ИЗМЕНИТЬ
Ок, не \w... Но согласно MSDN, мы можем вместо этого использовать: Al. Отредактировано выше, чтобы использовать это вместо.
Кроме того, со страницы MSDN я собираюсь, что она должна работать, поскольку ссылки, похоже, работают как обычно.
Ответ 4
Прочный способ сделать это - использовать инструмент рефакторинга. Они знают синтаксис языка, поэтому они понимают концепцию "оператора присваивания" и могут правильно выбирать все выражение с обеих сторон оператора присваивания, а не ограничиваться одним идентификатором, и это то, что я думаю, что все регулярные выражения пока что охватили. Инструменты рефакторинга обрабатывают ваш код как структурированный код, а не только текст. Я нашел упоминание двух надстроек Visual Studio, которые могут это сделать:
(Инвертирование назначения не является технически рефакторингом, так как оно изменяет поведение программы, но большинство инструментов рефакторинга расширяют значение, чтобы включить другие общие модификации кода, подобные этому.)
Ответ 5
Пожалуйста, ознакомьтесь с этим вопросом: Есть ли способ сменить левую и правую стороны набора выражений в Visual Studio?
Мой ответ на этот вопрос содержит макрос, который можно использовать для замены назначений для блока кода.
Ответ 6
Я немного улучшил выражение.
Заменить
(\t+)(\s*)(\S*) = (\S*);
с
$1$2$4 = $3;
Причина в том, что он будет искать строки, начинающиеся с tab (\ t). Он пропустит строки, начинающиеся с определения. Например:.
TestClass tc = new TestClass();
int a = 75;
int b = 76;
int c = 77;
a = tc.a;
b = tc.b;
a = tc.c;
Будет игнорировать int a, int b и int c и заменять только присваивания.
Ответ 7
как насчет замены всех (CTRL-H)
вы можете заменить, например, "i = j;" по "j = i;"
вы можете использовать регулярные выражения в этом диалоговом окне. Я не уверен, как вы должны всплывать о них. В этом диалоговом окне нажмите F1, затем найдите эту страницу для получения дополнительной информации о регулярных выражениях.
Мне нравится этот диалог, потому что он позволяет вам проходить каждую замену. Поскольку вероятность взлома чего-то высока, я думаю, что это более безопасное решение
Ответ 8
Вы можете выполнять поиск и замену регулярными выражениями в Visual Studio, но было бы безопаснее выполнять обычный поиск и замену для каждого присваивания, которое вы хотите изменить, а не массового изменения.
Ответ 9
В Visual Studio 2015+ после выбора блока кода нажмите Ctrl + H
:
Найти: (\w+.\w+) = (\w+);
Заменить: $2 = $1;
Например:
entity.CreateDate = CreateDate;
изменяется на:
CreateDate = entity.CreateDate;