2012-04-04 10 views
0

私の意見では、Vimscriptには文字列を操作するための多くの機能がありません。
私はしばしばmatchstr()、substitute()en、strpart()をあまり使わないことがあります。
おそらくそれ以上のことがあります。vimの文字列の操作

p.e.次の文字列 "a"の列番号間のすべてのテキストを削除する最も良い方法は?

let a = "\%8l............\|\%11l..........\|\%17l.........\|\%20l...." --> etc 

私は数字だけを残してリストに入れたいと思っています。
(linenumbers間のテキストはdiffentすることができる)

EDIT:私は取得したい
出力:
[ '8'、 '11'、 '17'、 '20'] - >など

+0

入手したいサンプルを提供してください。 – romainl

+0

''<,'> s /(\ d +)。* $/\ 1/g'またはより正確に必要なものを記述してください – kirilloid

+0

romainl、kirilloid、編集後に見てください。 – Reman

答えて

5

あなたは、分割()を探している

echo split(a, '[^0-9]\+') 

EDIT:

が新しい制約を考える:数字のみを\%d\+lから、私がしたい:

echo map(split(a, '|'), "matchstr(v:val, '^%\\zs\\d\\+\\zel')") 

NBを:あなたのvim変数が正しくフォーマットされ、唯一のバックスラッシュを使用するには、次のように記述する必要があると思いますシングルクォートであなたの文字列。二重引用符では、ここに2つのバックスラッシュが必要です。だから、 、

let b = '\%8l............\|\%11l..........\|\%17l.........\|\%20l....' 

と、それは一つは彼らにへ を追加し、対象試合のすべてを上で実行するために( :help sub-replace-\=を参照)の発現機能で代替を利用することができ

echo map(split(b, '\\|'), "matchstr(v:val, '^\\\\%\\zs\\d\\+\\zel')") 
+0

これはいいリュックですが、私が欲しいものではありません。 %\ d \ + lの間のテキストに数字がある場合にも分割されます – Reman

+0

Luc、文字列 "b"に '> - <'もあれば分割コードはどうなりますか:\%8l ... .. \ | \%> 10l - \%<15l \ ..... \ | \%17l ..... '?結果は '['8'、 '11-14'、 '17']でなければなりません前もってありがとうございます:) – Reman

+0

申し訳ありません、結果は' ['8'、 '11'、 '12'、 '13' '14'、 '17'] ' – Reman

2

なりリスト。

:let l=[] | call substitute(a, '\\%\(\d\+\)l', '\=add(l,submatch(1))[1:0]', 'g') 
+1

Damn。私たちはいつも新しいヴィム・トリックを学ぶことができます。私は 'substitute()'が '\ ='をサポートしていることに気づいていませんでした。ありがとう! –

+0

Ib、文字列 "b"に '> - <'もある場合、あなたの分割コードは何でしょうか:\%8l ..... \ | \%> 10l - \%<15l ... .. \ | \%17l ... '。 ?結果は '['8'、'11 -14 '、' 17 ']'または' ['8'、 '11'、 '12'、 '13'、 '14'、 '17'] ' – Reman

+0

私は空白で行のブロックを埋める関数を作成し、行のブロックをクリップボードにコピーする関数を作成しました。私は最初に別の機能でそれらを選択します。 :) – Reman