2011-09-03 32 views
7

vimで逆参照と正規表現を使用して実行しようとしている検索と置換操作があります。興味深いことに、私は純粋な検索を行う場合にのみパターンを認識しますが、検索して置換すると、E486:pattern not foundというエラーが表示されます。 FOOは、各ライン上のいくつかの別の変数名ですパターンはvim検索で見つかりましたが、vim検索と置換では見つかりませんでしたか?

function(Nullable<double>(1.1), map[FOO]); 

は、私は、フォームの関数呼び出しの束を持っています。私は

:%s/Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g 

をしようとするとそれは私に与え

function(othermap[ FOO ], map[FOO]); 

にそれを有効にする「パターンが見つからないエラーが発生しました。」偶数

はパターンを認識していないため動作しません。しかし、私はまったく同じ検索正規表現で次のコマンドを試してみると:

/Null.*\(map[\)\(.*\)\] 

正しくハイライト表示されます。その後、%s // othermap [\ 2]、\ 1 \ 2]を使って置換えを行うことができます。結局私の交換をすることができたのですが、なぜ私の人生はパターンがあるケースでは認識され、他のケースでは認識されないのか理解できません。

+0

[VIMは明らかに存在している簡単なフレーズを見つけて代わるものではありません](https://stackoverflow.com/questions/5289262/vimの可能性のある重複-Does-not-find-and-replace-simple-phrase-that-is-present-present) –

答えて

9

あなたの質問から私のvimセッションにcopy'n'pasteを使用して結果を再現できます。私が手に詳細なメッセージは、しかし、である:それは開始時にs/を失ったこと

E486: Pattern not found: Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g 

注意。

しかし、この時にかなり慎重に見て、トラブルがエスケープされていない[です:

s/Null.*\(map[\)\(.*\)\]/othermap[ \2 \], \1\2\]/g 
      ^
      |-- here; you need \[ to match the literal 

私は%表記を使用しないでください。私は自動的に書き込みます:

:g/Null.*\(map\[\(.*\)\]\)/s//othermap[\2], \1/g 

これはキャプチャが少し異なります。交換文字列に\]というバックスラッシュを使用する必要もありませんでした。

しかし、このコマンドはまた、私の作品:

:%s/Null.*\(map\[\(.*\)\]\)/othermap[\2], \1/g 
+0

ああ、私はあなたが最初の角括弧も逃れなければならないことを知らなかった。大括弧の振る舞いは、私がそれをエスケープしなくても、多くの状況でよく働くように見えるので、私にとっては奇妙です。ありがとう! – bhh1988