VIM搜索和替换:更换之前更改字符串

时间:2015-08-19 18:35:15

标签: regex search vim replace

我需要替换PHP文件中的几行,如下所示(这只是一个例子,但它代表了真正的问题):

<?php

$errors = array(
    'error_1',
    'error_2',
    'error_3',
    'error_4',
    'error_5',
);

我想让它们成为一个关联数组,没问题:

:%s/'\(.\+\)',/'\1' => '\1',/g

我将得到以下输出:

<?php

$errors = array(
    'error_1' => 'error_1',
    'error_2' => 'error_2',
    'error_3' => 'error_3',
    'error_4' => 'error_4',
    'error_5' => 'error_5',
);

但问题是:我想从数组值中删除下划线(键必须包含不需要的内容),有没有一种方法可以在替换为\ 1之前用空格替换下划线?

这就是我想要的输出:

<?php

$errors = array(
    'error_1' => 'error 1',
    'error_2' => 'error 2',
    'error_3' => 'error 3',
    'error_4' => 'error 4',
    'error_5' => 'error 5',
);

2 个答案:

答案 0 :(得分:2)

如果它们都以error_开头,请使用:

%s/'error_\(\d\)'/'error_\1' => 'error \1'/g

否则如果所有你可以使用的是下划线,你只需要为它定义一个模式并捕获2个组:

%s/'\(\w\+\)_\(\d\)'/'\1_\2' => '\1 \2'/g

答案 1 :(得分:2)

您可以使用

%s/\v'(.+)'/\="'" . submatch(1) . "' => '" . substitute(submatch(1), "_", " ", "g") . "'" 

\=启动“子替换表达式”(请参阅​​:h sub-replace-\=),您可以使用submatch(1)访问\1substitute()(请参阅:h substitute())在第二次出现时将“_”替换为“”,如果您只想替换"g"中的第一个"",请将"_"更改为\1 })。

\1中捕获周围的单引号会使替换部分更容易阅读

:%s/\v('.+')/\=submatch(1) . " => " . substitute(submatch(1), "_", " ", "g") 

当然,如果模式足够简单,那么两位炼金术士的解决方案可能更快/更容易使用/记忆。