如何获得split()未在VIM中返回的列表?

时间:2011-01-23 22:09:30

标签: vim

在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(),这应该是可能的。

2 个答案:

答案 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]来实现您已实现的功能。