我需要替换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',
);
答案 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)
访问\1
和substitute()
(请参阅:h substitute()
)在第二次出现时将“_”替换为“”,如果您只想替换"g"
中的第一个""
,请将"_"
更改为\1
})。
在\1
中捕获周围的单引号会使替换部分更容易阅读
:%s/\v('.+')/\=submatch(1) . " => " . substitute(submatch(1), "_", " ", "g")
当然,如果模式足够简单,那么两位炼金术士的解决方案可能更快/更容易使用/记忆。