Что такое регулярное выражение для поиска функции, содержащей определенный текст? - PullRequest
1 голос
/ 07 января 2011

Я спрашиваю это частично, потому что это что-то, что я нахожу очень полезным, но также чтобы понять синтаксис ответа, чтобы я мог создавать свои собственные, творческие, лучшие регулярные выражения!

Итак, вот вопрос: я хочу найти функцию в своем коде, и я знаю часть имени функции и что-то внутри функции.Например, с учетом этих функций:

Foo::bar1(Baz* baz)
{
    ...
    doWork();
    ...
}

Foo::bar2()
{
    ...
    beHappy();
    ...
}

Foo::hasAbar3Meat(Baz* baz1, Baz* baz2)
{
    ...
    beSad();
    ...
}

Я хочу найти любую из этих функций "bar", в которых есть слово "beHappy", используя регулярные выражения .Имейте в виду, что эти функции могут вызывать друг друга, и в целом мы не знаем, что находится в «...».Может даже случиться так, что в более чем одной из этих функций есть «beHappy».

РЕДАКТИРОВАТЬ: Если это невозможно из-за того, что C ++ не является обычным языком, объясните, почему, и, если возможно, укажитерешение с необходимыми ограничениями (например, «нет вложенных блоков кода - с помощью фигурных скобок {} - в коде»).

Ответы [ 3 ]

4 голосов
/ 07 января 2011

Делая вид, что каждая функция имеет правильный отступ (нет блоков кода, которые принадлежат функции и имеют отступ, который меньше или равен отступу определения функции):

/\v(^\s*)regexForFunctionName\(.*[^;](\n\1\{)?(\n$|\n\1\s.*){-}\n\1\s.*\zs(whatToFind)/

(скобки вокруг whatToFind здесь только для большей читабельности). Для вашего конкретного примера регулярное выражение будет выглядеть так:

/\v(^\s*)[^(]*bar.*\(.*(\n\1\{)?(\n$|\n\1\s.*){-}\n\1\s.*\zsbeHappy/

Лучше убрать единственный знак ? рядом с (\n\1\{), чтобы уменьшить вероятность того, что он захватывает код, который не является определением функции. В зависимости от стиля кода могут быть наложены дополнительные ограничения на часть, заканчивающуюся (\n\1\{)?. Обратите внимание, что если вы используете perl (и, возможно, pcre), вы можете написать выражение, которое будет работать с любым допустимым кодом C ++, но это выражение определенно не будет регулярным.

1 голос
/ 07 января 2011

Вы можете использовать оператор \_ для поиска в vim (отметьте :h /\_):

/Abar.*\_.*Sad/
0 голосов
/ 07 января 2011

Если вам нужен код C ++, вы не можете использовать регулярные выражения. Просто подумайте, что макросы могут сделать с вашим кодом. Это допустимый C ++ при наличии макросов

VOID_MEMBER_FUNCTION(Foo, bar)

    beHappy();

END_FUNCTION

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...