用vim替换单词边界

时间:2015-07-29 09:26:15

标签: regex vim replace sed

我想将对象属性引用转换为数组,如下所示:

  

$ stuff-> a_property

进入

  

$东西[ 'a_property']

我试过

s/->.*\>/['\0'\]/g

但它给了我

  

$东西[ ' - > a_property']

3 个答案:

答案 0 :(得分:5)

您可以使用已捕获的群组

:%s/->\(.*\)\>/['\1'\]/

\(.*\)用于在->之后将值替换为用于替换的组#1。这将为您提供$stuff['a_property']

编辑:如果您想在每行进行多次替换,请使用:

:%s/->\(.\{-}\)\>/['\1'\]/g

.\{-}用于非贪婪匹配,而.*则贪婪。

答案 1 :(得分:1)

表达式中的正则表达式匹配->,然后替换[]内的整个匹配项。这就是你得到的原因

$stuff['->a_property']

@anubhava已经发布了答案,但是我会使用\v运算符提出另一种可能更具可读性的变体:

:s/\v\-\>(.*)>/['\1']/g

\v表示“处理模式中的所有后续字符,不包括0-9a-zA-Z_,视为特殊”。有关详细信息,请参阅:help /\v

答案 2 :(得分:1)

:s/->\zs.*\>/['\0'\]/g

也可以从->的文字中排除\0