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

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

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

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

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

но не эти виды

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

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

Ответы [ 3 ]

7 голосов
/ 13 января 2009

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

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

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


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

4 голосов
/ 13 января 2009

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

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

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

Пример 1

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

Пример 2

/* Big comment
   if ( true ) {
*/

Список можно продолжать и продолжать.

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

0 голосов
/ 25 мая 2009

Вы можете в Google для Finite-State Machine выяснить, почему невозможно написать чистое регулярное выражение, о котором вы просите.

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

...