2010-05-30 4 views
0

Есть ли способ поиска нескольких вложенных операторов if в коде с использованием регулярного выражения?Локализация нескольких вложенных операторов If с использованием регулярных выражений

Например, выражение, которое будет найти экземпляр, если заявления трех или более слоев глубоко с различными стилями (если, если/иначе, если/ElseIf/другое):

if (...) { 
    <code> 
    if (...) { 
     <code> 
     if (...) 
      <code> 
    } else if (...) { 
     <code> 
    } else { 
     <code> 
    } 
} else { 
    <code> 
} 
+0

Что вы действительно хотите сделать? –

ответ

3

Использование регулярных выражений для поиска исходного кода - плохая идея. ИМО. Лучше использовать какой-либо инструмент, который анализирует исходный код, а затем позволяет запрашивать деревья синтаксического анализа, используя (например) выражения пути стиля XPath.

Проблема с регулярными выражениями для поиска исходного кода заключается в том, что они, как правило, слишком трудны для чтения и записи (если вы не являетесь гуру регулярных выражений), и они подвержены ложным срабатываниям и ложным негативам из-за некоторого края, что регулярное выражение создатель не думал. (К примеру, с помощью \ ихххх символов в ключевых словах.)

Вот некоторые инструментальные ссылки:

(. Пожалуйста, не стесняйтесь предложить другие)

+0

Можете ли вы предложить инструмент (ы) с открытым исходным кодом? Предпочтительно язык-общий. Кроме того, почему это плохая идея? – TERACytE

+0

@TERACytE - Я считаю, что PMD - хорошее место, чтобы начать искать. –

+0

PMD, похоже, поддерживает только Java. Yasca, кажется, обрабатывает несколько языков с помощью плагинов, но вы можете создавать собственные плагины только с помощью регулярных выражений. – TERACytE

-3

Try:

Немного многословный, но он ищет 3 или более оператора, состоящих из оператора if с условием и необязательными фигурными скобками, или оператора else if с необязательным условием и необязательными фигурными скобками.

+0

Как обычно, регулярные выражения не будут работать. Если вы столкнулись с строкой или комментарием или переменными, содержащими последовательность «if», это не сработает. Вы не можете анализировать языки программирования с помощью регулярных выражений. –

1

Если, Я неправильно понял этот ответ окончательно нет. Причина в том, что если вам нужно отслеживать уровень вложенности, вы говорите о подмножестве языка, которое невозможно сопоставить, как регулярное выражение. Регулярные выражения могут распознавать только то, что фиксируется в детерминированном конечном автомате. Чтобы сделать что-то подобное, требуется стек или счетчик, который переводит вас на более мощный класс автоматов, называемый push-down automaton.

Смежные вопросы