gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:14:25 26 4
gpt4 key购买 nike

我正在尝试编写一个 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

EDIT* 根据评论者 FDinoff 修复了转义

最佳答案

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

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

这首先定位下一个匹配行,然后提取匹配文本。请注意,这会移动光标,但是将 'n' 标志设置为 search() 可以避免这种情况。

关于regex - 如何将正则表达式捕获组存储为 vim 脚本中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24832502/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com