как сопоставить блок кода функции с регулярным выражением - PullRequest
0 голосов
/ 02 февраля 2010

Что мне нравится делать, так это удалять все функции, например, с определенным словом, если слово «яблоко»:

void eatapple()
{
// blah
// blah
}

Я хотел бы удалить весь код от 'void' до '}'. Я попробовал:

^void.*apple(.|\n)*}

Но прошло очень много времени, я думаю, что-то здесь не так.

Я использую Visual Studio. Спасибо.

Ответы [ 5 ]

2 голосов
/ 29 августа 2011

Чтобы прояснить возможное решение Чжонга, которое, я думаю, довольно умно: оно работает, но это зависит от кода, отформатированного очень специфическим способом. Но это нормально, потому что большинство IDE в любом случае могут применять определенный стандарт форматирования. Если я могу привести связанный пример - проблема, которая привела меня сюда - я искал выражения формы (на Java)

if (DEBUG) { 
  // possibly arbitrary statements or blocks
}

, что, да, технически не регулярно, но я запустил средство форматирования кода Eclispe для файлов, чтобы убедиться, что все они обязательно выглядят так (обычно предпочитаемый стиль кода нашей компании):

if (DEBUG) {
  statement();
  while (whatever) {
    blahblahblah(etc);
  }
  // ...
}

и затем ищем это (это, конечно, синтаксис Java regex)

^(\s*)if \(DEBUG.*(?:\n\1  .*)*\n\1\}

сделал свое дело.

1 голос
/ 02 февраля 2010

Наконец сделал это.

^void.*(a|A)pple\(\)\n\{\n((\t.*\n)|(^$\n))*^\}
0 голосов
/ 02 февраля 2010

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

0 голосов
/ 02 февраля 2010

Переключиться на VI.Затем вы можете выбрать открывающую скобку и нажать d%, чтобы удалить раздел.

0 голосов
/ 02 февраля 2010

Функциональные блоки не являются регулярными, поэтому использование регулярного выражения в этой ситуации - плохая идея.

Если у вас действительно есть огромное количество функций, которые нужно удалить (больше, чем вы можете удалить вручную (предполагая, что с вашей базой кодов что-то не так, - но я отвлекся)), то вам следует написать быстрый синтаксический анализатор со скобками вместо того, чтобы пытаться использовать регулярные выражения в этой ситуации.

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

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