Vim正则表达式查找/替换将php数组表示法转换为对象表示法

时间:2014-05-12 14:11:13

标签: regex vim

在PHP文件中,我正在尝试将所有数组表示法转换为对象表示法。换句话说,我正在尝试转换所有这些:

$事情[ '键']

成:

$东西─>键

我认为这是一个简单的正则表达式问题。我正在寻找这种模式:

\$thing\['(.*?)'\]

替换为:

$thing->\1

它在Text Wrangler中正常工作,但在VIM中不起作用。这是我正在尝试运行的完整命令:

:s/\$thing\['(.*?)'\]/$thing->\1/g

我得到的错误是:

E486: Pattern not found: \$thing\['(.*?)'\]

我还尝试了围绕该组使用转义括号的命令:

:s/\$thing\['\(.*?\)'\]/$thing->\1/g

但我得到同样的错误。有人可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

您必须转义括号才能进行分组,使用.\{-}表达式进行非贪婪的匹配。这就像是:

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

答案 1 :(得分:2)

作为替代方案,您也可以这样做:

qq           ; save macro in register q
/$thing<CR>  ; look for next $thing
"adi'        ; remove everything between quotes on current line and place it in register a 
; result: $thing[''_]
l            ; move to next character on right
; result: $thing['']_
d%           ; remove everything up to matching bracket
; result: $thing
i-><ESC>
; result: $thing->
"ap          ; paste from register a
; result: $thing->key
q            ; end macro

并使用宏删除下一个:

@q

以及下一个重复宏:

@@

并重复宏42次:

42@@

答案 2 :(得分:0)

参见Grouping and backreferences,必须转义paranthesis。 以下适用于我

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