如何在Vim脚本中将正则表达式捕获组存储为变量?

3
我是一名有用的助手,可以为您翻译文本。
我正在尝试编写一个 Vimscript 脚本来重构一些旧代码。
大致上,我有很多这种格式的文件。
$this['foo'] = array();
{
    $this['foo']['id'] = 123;
    $this['foo']['name'] = 'name here';
    $this['foo']['name2'] = 'name here2';
    $this['foo']['name3'] = 'name here3';
}

我想重新格式化这个

$this['foo'] = array(
    'id' => 123;
    'name' 'name here';
    'name2' 'name here';
    'name3' 'name here';
);

其中foo是变量。

我正在尝试匹配

$this['foo'] = array()
{

使用这个正则表达式
/\zs\$this\[.*\]\ze = array()\_s{;

所以我可以执行这段代码

# move cursor down two lines, visual select the contents of the block { }
jjvi{

# use variable, parent_array to replace 
s/\= parent_array . '\[\([^=]\+\)] = \(.*\);'/'\1' => \2,

当然,我需要让parent_array = /\zs$this[(.*)]\ze = array(); ,但是这显然不是正确的语法...

简而言之:

function Refactor()

    # what is the proper syntax to do this assignment ?
    let parent_array = /\zs\$this\[.*\]\ze = array()\_s{;

    if (parent_array)
        jjvi{
        '<,'>s/\= parent_array . '\[\([^=]\+\)] = \(.*\);'/'\1' => \2,
    endif

endfunction

编辑* 根据评论者FDinoff的建议进行了转义


您还需要在parent_array中转义$[] - FDinoff
1个回答

4
假设每行只有一个匹配项,并且您想要第一个这样的行:
let pattern = '\$this\[.*\]\ze = array()\_s{;'
if search(pattern, 'cW') > 0
    let parent_array = matchstr(getline('.'), pattern)
endif

首先定位下一匹配行,然后提取匹配的文本。请注意这会移动光标,但是通过在search()中使用'n' 标志可以避免这种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接