Vim正则expression式反向引用
我想做这个:
%s/shop_(*)/shop_\1 wp_\1/
为什么不shop_(*)
匹配任何东西?
这里有几个问题。
-
vim regexen中的parens不是为了捕获 – 你需要使用
\( \)
来捕获。 -
*
并不意味着你的想法。 它的意思是“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_”,然后是任意数量的开括号,然后是右括号)