2011-01-23 1 views
0

VIMでは:echo split('abcd123ef4ghij56k', '\d\+')を実行するとリスト[abcd', 'ef', 'ghij', 'k']の表現が出力されます。しかし、split()が返さなかったものを出力する動作を探しています。この場合は['123', '4', '56']です。split()がVIMで返さなかったリストを取得するには

もちろん、ここのような簡単な例では、私が望むものを得るためにパターンを\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と呼び出しが一致せずに()を2回可能であるべきと考えています。これは一般的なケースでは良い解決策がある場合

+0

パターンに一致するすべてのテキストを取得したいですか? –

+0

はい、すべて一致するパターンが1つのリストのリストとして、すべて一致するテキストのみです。 –

+1

split()の対立はこれを説明する奇妙な方法です。私は、ほとんどの場合、 'split()'の "反対"は 'join()'だと言います。タイトルを明確にすると、より良い回答が得られる可能性があります。 –

答えて

0

私は運がないネガティブなパターンを使用しようとしました(私はいつもロジックに問題があります)。とにかく あなたが本当に短いものを望むなら、パターンの2回の間にあるものを '#'で置き換え、最後に '#'に分割する代わりの呼び出しに基づいて、常に1ライナーを持つことができます

それ以外の場合は、実装した関数を実装するためにmatch()とmatchend()+ the_full_string [begin:end]を使用します。

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

分割。

+0

OPが言っているように、実際のパターンは '\ d'ではありません。その場合、 '\ D \ +'は 'split()'の完璧なパラメータでした。たとえば、 'foo'や' fo * 'のような明確な逆を持たないものを試してみてください。 –

関連する問題