Vim正则expression式反向引用

我想做这个:

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

为什么不shop_(*)匹配任何东西?

这里有几个问题。

  1. vim regexen中的parens不是为了捕获 – 你需要使用\( \)来捕获。

  2. *并不意味着你的想法。 它的意思是“0或更多的前面”,所以你的正则expression式意思是“一个string,其中包含shop_然后是0+ (然后是文字)
    你在找 ,这在正则expression意思是“任何字符”。 .*与星号放在一起.*表示“0或更多的任何字符”。 您可能需要至less一个字符,所以请使用.\++表示“以前的一个或多个”)

使用这个: %s/shop_\(.\+\)/shop_\1 wp_\1/

可以在最后一个斜线后用g结束,以replace一行上的所有实例而不是第一行。

如果我理解正确,你想%s/shop_\(.*\)/shop_\1 wp_\1/

转义捕获括号并使用.*来匹配任意数量的任何字符。

(您的search正在search“shop_”,然后是任意数量的开括号,然后是右括号)