Я использую Visual Studio 2022 и хочу заменить все вхождения определенного шаблона if своим новым кодом.
Например, вот ситуации, которые я хочу найти:
if (builder == null)
throw new ArgumentNullException(nameof(builder));
if (builder == null)
throw new ArgumentNullException(nameof(builder));
if (builder==null)
throw new ArgumentNullException(nameof(builder));
if (builder == null) {
throw new ArgumentNullException(nameof(builder));
}
if (builder==null) throw new ArgumentNullException(nameof(builder));
if (builder == null) throw new ArgumentNullException(nameof(builder));
if (builder==null) {
throw new ArgumentNullException(nameof(builder));
}
и замените их на
ArgumentNullException.ThrowIfNull(builder);
Я попробовал использовать встроенную функцию Visual Studio «Найти и заменить» и использовать регулярное выражение, соответствующее моему шаблону поиска:
if\s*\(\s*([^)]+)\s*==\s*null\s*\)\s*{?\s*throw\s*new\s*ArgumentNullException\s*\(\s*nameof\(\1\)\s*\);\s}?
Проблема в том, что это работает в regex101, но не в Visual Studio.
Вот регулярное выражение101: https://regex101.com/r/usKBOk/1
Вот снимок экрана с моими настройками поиска, в которых я пытаюсь проверить, найдет ли что-нибудь Visual Studio:
К вашему сведению: \s*{?\s* — это плохо, вы должны записать его как \s*(?:{\s*)?, чтобы предотвратить избыточный возврат.
@WiktorStribiżew спасибо за совет. На снимке экрана может быть показано, как я пытаюсь исправить регулярное выражение, но в вопросе указано именно то регулярное выражение, которое я использовал.
Попробуйте экранировать фигурные скобки.
Кто-нибудь хочет объяснить отрицательные голоса? Кто-нибудь из вас пробовал это в Visual Studio или просто пробует регулярное выражение и задается вопросом, почему я вообще об этом спрашиваю? Это потому, что это не работает в Visual Studio.





Похоже, что регулярное выражение Visual Studio в функции «Найти и заменить» следует тем же правилам, что и код Visual Studio, и шаблон никогда не будет соответствовать разрывам строк с \s или [^()], если в самом шаблоне нет \n или \r.
В таких случаях я бы все равно предложил надежное решение: добавьте шаблон \r{0} в начале.
Итак, в вашем случае вы можете использовать
\r{0}if\s*\(\s*([^)]+)\s*==\s*null\s*\)\s*{?\s*throw\s*new\s*ArgumentNullException\s*\(\s*nameof\(\1\)\s*\);\s*}?
Альтернативные решения
\r или \n внутри первого положительного или даже отрицательного (!) класса символов, например. [^)] => [^)\n] или [^)\r]. Это странно для обычных пользователей регулярных выражений, но оно работает в редакторе Visual Studio и Visual Studio Code. Это не рекомендуется, поскольку тестирование с помощью онлайн-инструментов регулярных выражений не будет соответствовать результатам VS.\s* на [\s\r]* (нет необходимости повторять это со всеми остальными вхождениями \s в шаблоне, поскольку первый автоматически включает [^)], \s и \p{Z} для соответствия разрывам строк). Это безопасно использовать, поскольку оно совместимо с онлайн-тестерами регулярных выражений.Скриншот демо:
Спасибо, в Visual Studio это работает так, как и ожидалось.
Я вижу, вы опубликовали шаблон (в виде текста), который заканчивается на
\s}?, но шаблон на скриншоте (не полностью виден) заканчивается на\s*}?. Вы уверены, что использовали в VS тот же шаблон, что и в regex101?