2017-11-23 2 views
1

Windows上でVim 7.4を使用すると、Cファイルのコードから括弧の前後の不要なスペースを削除しようとしています。例:VimのRegexは、1回目のパスで2回目の一致を失い、2回目のパスが必要です

copyFunc (copyLength, sizeof (type)); 

次のパターンは、閉じ括弧の前にスペースを削除します。

:%s/\(\S\))/\1)/g 

私は、上記のパターンは、すぐ上の行にtype後の最初のスペースを削除したことを見つけるために驚いたが、行の末尾にある最後の2つの連続する閉じ括弧))の間の次の行をスキップしました。

copyFunc (copyLength, sizeof (type)); 
            ^
            Not removed on first pass 

回避策の解決策はありません。むしろ、私はこの正規表現の動作の原因を理解することに興味があります。

+1

最初に置き換える使用できない、 ')'最初まで消費します次のマッチで '\ S'とマッチします。 vimでそれらを実装している場合は、先読みを使用して括弧の有無をテストすることができます。または、スペースの前に文字をマッチさせることを控えることができます。これは、複数のスペースや行頭の動作を変更します。 – Aaron

+0

@Aaron私は理解していると思います。最初の一致後、最後の閉じ括弧の前のスペースから照合プロセスが続きます。パターンは3文字で、行の最後の3文字はパターンを満たしません。私は正しいですか? – Sabuncu

+0

はいこれが正しいです – Aaron

答えて

3

無限の再帰を避けるため(そして、それは一般的に理にかなっているため)するには、:substitute/gフラグは唯一テキストがまだテキストの行にさらなる反復のためにを一致していないと考えています。

あなたのパターンのリテラル)は閉じ括弧に一致します。したがって、それ以降の繰り返しでは再び一致することはできません(今回は\S)。

これを修正する方法の1つは、の前にの終了括弧を終了することです。これは\zeで試合を終了することにより、(Vimの中)正先読み、またはより簡単に行うことができます。

:s/\(\S\) \ze)/\1/g 
+0

はい、これは動作します。ありがとうございました!今私は "どのように"詳細を学ぶ必要があります。 :) – Sabuncu

関連する問題