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

陈大卫

我正在尝试编写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(); 这显然不是正确的语法...

TL; DR

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编辑*固定转义

英戈·卡卡特(Ingo Karkat)

假设一行中只有一个这样的匹配项,而您想要第一行这样的匹配项:

let pattern = '\$this\[.*\]\ze = array()\_s{;'
if search(pattern, 'cW') > 0
    let parent_array = matchstr(getline('.'), pattern)
endif

首先,找到下一条匹配的行,然后提取匹配的文本。请注意,这将移动光标,但是通过将'n'标志带有search()可以避免这种情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章