Я хочу найти все операторы if и for, за которыми не следует фигурные скобки «{». Когда вы пишете одну строку в операторе if, вы обычно не заключаете его в фигурные скобки, поэтому я хочу найти все эти операторы if и for.
Пожалуйста помоги!
Как будто я хочу запечатлеть это заявление
if (childNode.Name == "B")
return TokenType.Bold;
но не эти виды
if (childNode.Name == "B")
{
return TokenType.Bold;
}
Я хочу сделать это с помощью регулярного выражения.





Поскольку лежащая в основе математика не допускает идеального совпадения, вы можете воспользоваться хорошей эвристикой, например «найти все '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#. Не следуйте этой идее;) Идея Дэвида Шмитта хороша.