(g) vim заменяет регулярное выражение - PullRequest
5 голосов
/ 04 декабря 2009

Я ищу регулярное выражение, которое изменит что-то. как это:

print "testcode $testvar \n";

в

printnlog("testcode $testvar \n");

Я пытался %s/print\s*(.\{-});/printnlog(\1);/g, но gvim говорит

print\s*(.\{-});

не совпадает.

Где моя вина? Можно ли использовать '*' после '\ s', потому что позже '{-};' остановит жадность?

Заранее спасибо.

Ответы [ 4 ]

8 голосов
/ 04 декабря 2009

В vim вы должны добавить (, ) и | с обратной косой чертой, поэтому попробуйте

:%s/print\s*\(.\{-}\);/printnlog(\1);/g
4 голосов
/ 04 декабря 2009

Ответ MBO работает отлично, но иногда мне проще использовать «очень волшебный» вариант \v, поэтому мне не нужно избегать всего; делает регулярное выражение немного более читабельным.

Смотри также:

0 голосов
/ 04 декабря 2009

Достаточно ли этого для ваших нужд?

%s/print\s*\("[^"]*"\)/printnlog(\1)
0 голосов
/ 04 декабря 2009

Хотя вы можете создавать группы захвата (как и вы), я думаю, что самый простой подход - выполнять работу в несколько этапов, с очень простыми регулярными выражениями и «помечать» слова. Например:

:%s/print "testcode.*/printnlog(XXX&XXX);/
:%s/XXXprint //
:%s/;XXX//

В этих примерах я использую «XXX» для обозначения границ, которые должны быть позже обрезаны (вы можете использовать все, что не появляется в вашем коде). Амперсанд (&) берет всю строку соответствия и вставляет ее в строку замены.

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

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