2011-09-07 24 views
8

特定のパターンを特定の文字列に置き換える正規表現がありますが、それよりも動的にしたいのです。例えばVim regexをn文字で置き換えます。

、私はこの正規表現を持っていると言う:

%s/hello/-----/g

私は、しかし、代わりにこのような何かをしたいと思います:

%s/hello/-{5}/g

5とハローを置き換えることを意味しますダッシュ。

これを行う方法はありますか?

最終的に、私はこのような何かをしたいと思います:

長さがマッチした文字列の長さに等しいダッシュでのみ hello秒の列のすべてのインスタンスを置き換えます

%s/(hello)*/-{\=strlen(\0)}/g

答えて

19
%s/\v(hello)*/\=repeat('-',strlen(submatch(0)))/g 
+0

作品!ありがとう。利用可能なすべての機能(strlenやrepeatなど)がどこにあるのかわかりますか? – tjameson

+3

':h functions'は、 –

+3

または' function-list'をトリックします。時にはそれはより便利です。 – sidyll

5

置換コマンドを使用する代わりに、置換を実行する の編集コマンドを自動化できます。 の出現を上書きする最も簡単な方法は、特定の文字を手で検索するパターンです。

  1. 次のオカレンスの開始を検索します。

    /\(hello\)\+ 
    
  2. 最後まで一致するテキストを選択してください。

    v//e 
    
  3. 選択したテキストを置換します。だから、ステップから

    r- 
    
  4. 繰り返し1.

、コマンドに

:let[@/,@s]=['\(hello\)\+',"//\rv//e\[email protected]"] 

をこのルーチンの実行を自動化するの先頭からそのsレジスタの内容を実行します バッファ(または他の適切な場所):

[email protected] 
+0

再帰マクロで '// e'を使うと+1 –

関連する問題