Поиск нескольких вложенных операторов If с использованием регулярных выражений - PullRequest
0 голосов
/ 30 мая 2010

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

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

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

Ответы [ 3 ]

3 голосов
/ 30 мая 2010

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

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

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

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

1 голос
/ 30 мая 2010

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

0 голосов
/ 30 мая 2010

Попробуйте:

((if\(.+\)(\n)?.*\n|(else)?[ ]*(if\(.+\))?(\{)?(\n)*.*(\n)*(\})?){3}((if\(.+\)(\n)?.*\n|(else)?[ ]*if\(.+\)\{(\n)*.*(\n)*\})*

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

...