2013-06-08 2 views
1

У меня есть несколько функций, которые начинаются с get_ в моем коде: get_num(...), get_str(...)замена части регулярного выражения соответствует

Я хочу изменить их get_*_struct(...).

Могу ли я как-то соответствовать get_* регулярное выражение, а затем заменить в соответствии с рисунком, так что:

get_num(...) становится get_num_struct(...), get_str(...) становится get_str_struct(...)

Можете ли вы объяснить некоторую логику, потому теоретическому регулярное выражение не похожи на те, которые используются в UNIX (или vi, они разные?), и я всегда изо всех сил пытаюсь понять их.

Это должно быть сделано в редакторе vi, поскольку это основной инструмент для работы.

Спасибо!

ответ

3

Чтобы преобразовать get_num(...) в get_num_struct(...), вам необходимо зафиксировать правильный текст на входе. И вы не можете поместить круглые скобки в регулярное выражение, потому что вам может понадобиться сопоставить указатели на функции, как в &get_distance, и использовать в комментариях. Однако, и это частично зависит от того, что вы используете Vim и частично о том, как вы должны держать весь входной вместе, я проверил, что это работает:

%s/get_\w\+/&_struct/g 

На каждой строке, найти все выражение, начиная с get_ и продолжая, по крайней мере, одну букву, номер или знак подчеркивания и заменяя его всей совпадающей строкой, за которой следует _struct.

Штукатурка; Я не должен отвечать на эти вещи по спецификации. Обратите внимание, что другие двигатели регулярных выражений могут использовать \ & вместо &. Это зависит от наличия набора магии, который по умолчанию используется в vim.

+0

хороший снимок, есть вы на самом деле пробовали это на VI/VIM? – iruvar

+0

Упс.Я смешиваю языки регулярных выражений. Я исправлю это через мгновение. –

+0

Эта версия протестирована. –

1

Для альтернативный способ сделать это:

%s/get_\(\w*\)(/get_\1_struct(/g 

Что это делает:

  • \w матчи любому "буквенный символ"; \w* соответствует 0 или более символам слов.
  • \(...\) сообщает, что vim помнит все соответствия .... Так, \(w*\) означает «соответствовать любому количеству символов слова, и помните, что вы совпадаете. Вы можете получить доступ к нему в замене с \1 (или \2 для второго и т.д.)
  • Таким образом, общая картина get_\(\w*\)( ищет get_ , за которым следует любое количество словарных символов, а затем (
  • заменой, то просто делает именно то, что вы хотите

(Извините, если это слишком многословным. -. не уверен, насколько комфортно вы с Vim регулярных выражений.)

+0

превосходный описание! очень признателен! –

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