Visual Studio заменяет старый блок кода новым кодом

Я использую 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*}?. Вы уверены, что использовали в VS тот же шаблон, что и в regex101?

Wiktor Stribiżew 05.03.2024 13:33

К вашему сведению: \s*{?\s* — это плохо, вы должны записать его как \s*(?:{\s*)?, чтобы предотвратить избыточный возврат.

Wiktor Stribiżew 05.03.2024 13:34

@WiktorStribiżew спасибо за совет. На снимке экрана может быть показано, как я пытаюсь исправить регулярное выражение, но в вопросе указано именно то регулярное выражение, которое я использовал.

Rumplin 05.03.2024 13:44

Попробуйте экранировать фигурные скобки.

Wiktor Stribiżew 05.03.2024 14:35

Кто-нибудь хочет объяснить отрицательные голоса? Кто-нибудь из вас пробовал это в Visual Studio или просто пробует регулярное выражение и задается вопросом, почему я вообще об этом спрашиваю? Это потому, что это не работает в Visual Studio.

Rumplin 05.03.2024 18:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, что регулярное выражение 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 это работает так, как и ожидалось.

Rumplin 07.03.2024 10:51

Другие вопросы по теме