Как получить список, который split () не возвращал в VIM? - PullRequest
0 голосов
/ 24 января 2011

В 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 -loop и вызова match () дважды.

Ответы [ 2 ]

1 голос
/ 24 января 2011

Не уверен, что это хорошее решение в общем случае, но…

: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']

разделяется на границы между цифрами и не цифрами.

0 голосов
/ 24 января 2011

Я пытался использовать отрицательные образцы без удачи (у меня всегда есть проблемы с их логикой). Тем не мение. Если вы действительно хотите получить что-то короткое, у нас всегда может быть однострочная, основанная на нескольких вызовах, для замены, которая заменяет то, что находится между двумя вхождениями шаблона, на «#», а затем, наконец, разбивается на «#»

В противном случае я бы использовал match () и matchend () + the_full_string [begin: end] для реализации функции, которую вы реализовали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...