查找/替换不包含引号的字符串

时间:2013-12-13 12:33:44

标签: regex vim

我继承了一个相当大/丑陋的PHP代码库(语言不重要,这是一个通用的vim问题),没有任何引用正确(旧的PHP不介意,但新的PHP版本抛出警告)。

我想将$ something [somekey]转换成$ something ['somekey'],只要它尚未引用或包含字符$

我正在尝试构建一个正则表达式来引用键,但似乎无法让它合作。

这是我到目前为止所做的,但这不起作用,但可能有助于更好地解释我的问题。并表明我已经尝试过。

:%s/\v\$(.{-})\[(['"$]@<!.{-})\]/$\1['\2']/

我的目标是拥有这样的东西:

$something[somekey]            = $something['somekey']
$somethingelse[someotherthing] = $something['someotherthing']
$another['key']                = $another['key'] (is ignored)
$yetanother["keykey"]          = $yetanother["keykey"] (is ignored)
$derp[$herp]                   = $derp[$herp] (is ignored)
$array[3]                      = $array[3] (is ignored)

这些可以出现在文本的任何地方,甚至是同一行上的多个,甚至可以像$ something [key] $ something [key2]一样互相接触,我希望用$ something ['key'] $替换东西[ 'KEY2']

另一个问题,似乎在某些文件中有随机的javascript数组..它们有[]方括号。所以正则表达式需要检查它是否以括号前的$和text开头。

我可能会要求不可能,但是在我手动逐个编辑每个文件之前,对此的任何帮助都会很棒。

编辑:忘记密钥可以是数字,不应该引用。

1 个答案:

答案 0 :(得分:2)

我尝试了以下操作,正确处理了您问题中的所有内容:

:%s/\[\(\I\i*\)\]/['\1']/g

或者,在parens中有可选的空格:

:%s/\[\s*\(\I\i*\)\s*\]/['\1']/g

并在parens之前检查$identifier

:%s/\(\$\i\+\)\[\s*\(\I\i*\)\s*\]/\1['\2']/g
相关问题