gpt4 book ai didi

regex - 在vim中使用正则表达式匹配带括号的 block

转载 作者:行者123 更新时间:2023-12-04 03:54:34 28 4
gpt4 key购买 nike

我正在尝试匹配属于某个 ( 之间的内容及其匹配的) vim 在使用运动时发现的 % .

更具体地说,我正在寻找一个看起来像这个假设的正则表达式 /someKeyword (\{pair}\(.*\))\{pair}/ , 如果有 \{pair} 这样的修饰符当应用于正则表达式中的两个正好两个字符时,仅当第二个字符与第一个字符匹配时才匹配(% -wise)。

我正在寻找的模式应该与 someKeyword 之后的第一个括号的内部内容相匹配。 (注意它应该处理的代码总是正确括起来),如示例中所示:

对于 someKeyword ("aaa")子匹配将匹配 "aaa" .
同样someKeyword ("aaa)")将匹配 "aaa)"someKeyword(("double-nested stuff"))将匹配 ("double-nested stuff")
但也适用于以下情况:

(
someKeyword("xyz"))

它应该在哪里匹配 "xyz" .

有没有办法在正则表达式中使用 vim 的匹配括号功能?如果没有,还有什么其他解决方案可以实现这一目标?

编辑1:匹配的内容可能跨越多行。

最佳答案

这对于 vim 正则表达式是不可能的(因为允许这种嵌套结构的语言不是正则的),但对于 perl 提供的“正则”表达式(以及我不太了解的其他语言)和 perl 提供的“正则”表达式是可能的可以在 vim 内部使用。我不喜欢 vim-perl 绑定(bind)(因为它非常有限),但是如果您知道所有应该工作的情况,那么您可以使用 perl 正则表达式的递归功能(需要更新的 perl,我有 5.12*):

perl VIM::Msg($+{"outer"}) if $curbuf->Get(3) =~ /someKeyword\((?'outer'(?'inner'"(?:\\.|[^"])*"|'(?:[^']|'')*'|[^()]*|\((?P>inner)*\))*)\)/

注意,如果可以避免这样的正则表达式,你应该这样做(因为你太依赖re编译器了),所以我建议直接使用vim Action :
let s:reply=""
function! SetReplyToKeywordArgs(...)
let [sline, scol]=getpos("'[")[1:2]
let [eline, ecol]=getpos("']")[1:2]
let lchar=len(matchstr(getline(eline), '\%'.ecol.'c.'))
if lchar>1
let ecol+=lchar-1
endif
let text=[]
let ellcol=col([eline, '$'])
let slinestr=getline(sline)
if sline==eline
if ecol>=ellcol
call extend(text, [slinestr[(scol-1):], ""])
else
call add(text, slinestr[(scol-1):(ecol-1)])
endif
else
call add(text, slinestr[(scol-1):])
let elinestr=getline(eline)
if (eline-sline)>1
call extend(text, getline(sline+1, eline-1))
endif
if ecol<ellcol
call add(text, elinestr[:(ecol-1)])
else
call extend(text, [elinestr, ""])
endif
endif
let s:reply=join(text, "\n")
endfunction
function! GetKeywordArgs()
let winview=winsaveview()
keepjumps call search('someKeyword', 'e')
setlocal operatorfunc=SetReplyToKeywordArgs
keepjumps normal! f(g@i(
call winrestview(winview)
return s:reply
endfunction

你可以使用类似的东西
let savedureg=@"
let saved0reg=@0
keepjumps normal! f(yi(
let s:reply=@"
let @"=savedureg
let @0=saved0reg

而不是 operatorfunc 来保存和恢复寄存器,但上面的代码使所有寄存器和标记保持不变,我不能用 save* 的东西保证。它还保证如果您删除 join()text ,您将保存有关 NULL 位置的信息(当然,如果您关心它们)。寄存器变体不可能。

关于regex - 在vim中使用正则表达式匹配带括号的 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5139300/

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