Vim regex backreference - программирование
Подтвердить что ты не робот

Vim regex backreference

Я хочу сделать это:

%s/shop_(*)/shop_\1 wp_\1/

Почему shop_(*) не соответствует чему-либо?

4b9b3361

Ответ 1

Здесь несколько вопросов.

  • parens in vim regexen не предназначены для захвата - вам нужно использовать \( \) для захватов.

  • * не означает, что вы думаете. Это означает "0 или более предыдущих", поэтому ваше регулярное выражение означает "строка, содержащая shop_, за которой следует 0 + (, а затем литерал ).
    Вы ищете ., который в regex означает "любой символ". Сопоставим со звездой как .*, это означает "0 или более любого символа". Вероятно, вам нужен хотя бы один символ, поэтому используйте .\+ (+ означает "1 или более предыдущего" )

Используйте это: %s/shop_\(.\+\)/shop_\1 wp_\1/.

Опционально завершите его с помощью g после последней косой черты, чтобы заменить все экземпляры на одной строке, а не только на первую.

Ответ 2

Если я правильно понял, вы хотите %s/shop_\(.*\)/shop_\1 wp_\1/

Выйдите из скопированной скобки и используйте .* для соответствия любому количеству символов.

(Ваш поиск выполняет поиск "shop_", за которым следует любое количество открывающих круглых скобок, за которым следует закрывающая скобка)