4

私はvimを学んでいて、それがどれほど強力かを理解し始めています(特にreg式と組み合わせると)。現在、python ファイル内のすべての整数を浮動小数点値に置き換えようとしています。たとえば、[0, 0 , 0] のような [0.0, 0.0, 0.0] にする必要があるものに出くわします。

私が今持っている最高のものは: :%s/\(\d+\)\@<=s*,/.0,/g ですが、 0.032.0 のような結果を生成しています

2つのこと:

  1. 上記の問題を解決するための堅牢な方法を作成できる正規の専門家はいますか?
  2. これらの式がどれほど複雑になるかがわかり始めています。とにかく、私の.vimrcで整数または浮動小数点数の部分正規表現を定義し、それを後の呼び出しに埋め込む方法があると言うことはありますか? たとえば、必要な呼び出しは :%s/\($(AnInt)\)+/-/g で、整数の後のプラス記号をマイナスに変更します。(それまたは同等にモジュール化されたもの)
4

1 に答える 1

4

「0.032.0 のような」結果が得られているという仮定の下で操作するのは、0.032 から始めたからです。

注意、これは、非正規言語を解析するために正規表現のみを強制しようとしたときに起こることです。この正規表現が失敗する多くのエッジ ケースがあります。説明しながら説明していきます。

:%s/\(\[.*\)\@<=\([0-9]\+\)\(,[^,]*\.[^,]*\)\@<!\.\@!\(.*\]\)\@=/\2.0/cg

これはどのように作動しますか?

まず、自分が配列内にいることを確認したいと思います。\(\[.*\)\@<=

これは、リテラルを検索する後読みアサーションです。[

これは、複数行にわたって指定されたリストでは失敗し、次のような場合にも失敗します (3 と 4 に一致します)。

for (i,j,k) in zip([0, 0, 0], range(3), listOfLists[4]):

これは、複雑さとのトレードオフになります。意図しないことをしていないことを確認するために、すべての一致を再確認してください。

\([0-9]\+\)次に、実際にテキストを単純に一致させたいと思います。

次に、数字の前後にドットがないことを確認しますが、コンマの前後は無視します。 \(,[^,]*\.[^,]*\)\@<!

次に、試合の後に文字どおりのピリオドがないことを確認したいと思います。 \.\@!

]最後に、一致した後のどこかにリテラルがあることを確認したいと思います(配列内にいることを確認するため)。\(.*\]\)\@=

最後に、見つかったテキストを 2 番目にキャプチャされたグループに置き換え、ピリオドを追加します。

#2についてはいいえ、しかし、それらの領域を名前付きの貼り付けバッファにヤンクして、自由に使用できます。コマンド編集モードを使用するq:

于 2012-06-25T00:42:52.663 に答える