2010-07-26 147 views
47

我想这样做:Vim的正则表达式反向引用

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

为什么不shop_(*)匹配什么?

+0

我有点接近:'%s/shop _ /&wp_ \ 1' – nnyby 2010-07-26 21:22:13

+1

如果我没有正确理解,请尝试添加示例。 – Stephen 2010-07-26 21:25:56

+5

如果在正则表达式中尝试添加示例,此问题对未来的SO用户会更有用。 – LondonRob 2014-04-22 17:05:08

回答

7

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

逃离捕获括号,并使用.*匹配任意数量的任意字符。

(你的搜索搜索“shop_”后跟任意数量的左括号后跟一个右括号中)

56

这里有几个问题。在vim使用regexen

  1. 括号不能捕获 - 你需要使用\(\)俘获的。

  2. *并不意味着你的想法。它的意思是“0或以上”,所以你的正则表达式意思是“一个字符串,其中包含shop_,然后是0+ (,然后是)
    您正在寻找.,它在正则表达式中表示”任何字符“。连同明星作为.*它的意思是“0或多个任意字符”你可能需要至少一个字符,所以使用.\++表示“1个或多个前面的符号”)

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

可选择在结束斜杠后用g结束取代一条线上的所有实例而不仅仅是第一条。

+0

只是一个问题:现有的正则表达式没有搜索字面的'*)',只是一个文字')'。 – Stephen 2010-07-28 00:08:19

+0

@Stephen:Woops,你说得对。在那里错了。 – Daenyth 2010-07-28 00:17:37