2010-02-02 1 views
0

То, что я хотел бы сделать, это удалить все функции, которые имеют конкретное слово, например, если слово «яблоко»:как соответствовать функциям блока кода с регулярным выражением

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

Я хотел бы, чтобы удалить весь код от 'void' до '}'. То, что я попытался это:

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

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

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

ответ

0

Наконец-то это произошло.

^void.*(a|A)pple\(\)\n\{\n((\t.*\n)|(^$\n))*^\} 
0

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

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

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

+0

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

+0

@ Кодизм: подсчет брекетов прост. Вам просто нужно следить за gotchas как фигурные скобки в комментариях и строковых литералах. Вы правы, что для того, чтобы быть безошибочным, вам нужно написать для него контекстно-свободный парсер, но это уровень сложности этой задачи. Счетчик фигурных скобок должен быть в порядке, если нет никаких штрихов. – Welbog

0

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

0

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

+0

Я люблю VI. но я не знал этого.thanks –

+0

Знак процента перемещается в соответствующие скобки, скобки и круглые скобки. –

2

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

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

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

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

, а затем ищет для этого (это синтаксис регулярных выражений Java, конечно)

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

сделал трюк.

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