在VIM中,如果我执行:echo split('abcd123ef4ghij56k', '\d\+')
,则会打印列表[abcd', 'ef', 'ghij', 'k']
的表示形式。但我正在寻找一个行为,打印出split()没有返回的行为,在这种情况下:['123', '4', '56']
。
当然,在这里的简单示例中,我可以将模式更改为\D\+
以获得我想要的内容。然而,这不是我所追求的,因为模式是函数中的一个参数,我想我不知道如何相反模式。
这是一个返回表达式列表的函数:
function! MatchMultiplePatterns(txt, re)
let l:result = []
let l:pos = match(a:txt, a:re)
while l:pos != -1
let l:matchedString = matchstr(a:txt, a:re, l:pos)
let l:result += [l:matchedString]
let l:pos = match(a:txt, a:re, l:pos + strlen(l:matchedString))
endwhile
return l:result
endfunction
但是我相信如果没有while
- 循环并且两次调用match(),这应该是可能的。
答案 0 :(得分:1)
在一般情况下不确定这是否是一个好的解决方案,但是......
:echo split('abcd123ef4ghij56k', '\d\zs\ze\D\|\D\zs\ze\d') ['abcd', '123', 'ef', '4', 'ghij', '56', 'k'] :echo split('abcd123ef4ghij56k', '\d\@<=\D\@=\|\D\@<=\d\@=') ['abcd', '123', 'ef', '4', 'ghij', '56', 'k']
分割数字到非数字和非数字到数字的边界。
答案 1 :(得分:0)
我试图使用负面模式而没有运气(我的逻辑总是遇到麻烦)。 无论如何。如果你真的希望有一些简短的东西,我们可以总是有一个基于几个调用替换的单行代替用'#'替换两次出现的模式,然后最后拆分为'#'
否则,我将使用match()和matchend()+ the_full_string [begin:end]来实现您已实现的功能。