Я хочу найти все операторы if в коде C#, за которыми не следуют скобки. Через регулярное выражение

Я хочу найти все операторы if и for, за которыми не следует фигурные скобки «{». Когда вы пишете одну строку в операторе if, вы обычно не заключаете его в фигурные скобки, поэтому я хочу найти все эти операторы if и for.

Пожалуйста помоги!

Как будто я хочу запечатлеть это заявление

if (childNode.Name == "B")
    return TokenType.Bold;

но не эти виды

if (childNode.Name == "B")
{
    return TokenType.Bold;
}

Я хочу сделать это с помощью регулярного выражения.

Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
819
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Поскольку лежащая в основе математика не допускает идеального совпадения, вы можете воспользоваться хорошей эвристикой, например «найти все 'if', за которыми следует точка с запятой, без промежуточной открытой фигурной скобки:

/\<if\>[^{]*;/

где \< и \> - это начало и конец слова в зависимости от вашего диалекта регулярных выражений. Также позаботьтесь о том, чтобы игнорировать все символы новой строки во вводе, некоторым обработчикам регулярных выражений необходимо указать это.


Вы можете также посмотреть на StyleCop. Это инструмент, который выполняет большой набор различных проверок вашего исходного кода. Эта проверка уже есть.

Если вам нужно 100% рабочее решение, то регулярное выражение не подойдет. Слишком легко запутать регулярное выражение с реальным кодом. Возьмем, например, следующее регулярное выражение

"^\s*if\W[^{]*\n\s*[^{]"

Это будет соответствовать подавляющему большинству операторов if, не заключенных в фигурные скобки. Однако его легко сломать. Возьмите следующие образцы. Регулярное выражение неправильно помечает эти операторы как если бы в фигурных скобках.

Пример 1

if ( SomeFunction(() => { return 42; }) ) 

Пример 2

/* Big comment
   if ( true ) {
*/

У этого списка нет конца.

Итог: если вы хотите совершенства, регулярное выражение не будет работать. Если вас устраивает неидеальное решение, то приведенное выше регулярное выражение должно помочь.

Вы можете найти в Google конечный автомат, чтобы узнать, почему невозможно написать чистое регулярное выражение, которое вы запрашиваете.

С другой стороны, некоторые интерпретаторы reg-ex, например, в языке Perl, имеют возможность ссылаться на ранее согласованное выражение, что позволяет теоретически реализовать всю грамматику C#. Не следуйте этой идее;) Идея Дэвида Шмитта хороша.

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