1

私はCプロジェクトに取り組んでおり、すべてのブール変数チェックを変更したい

if(!a)

if(a == false)

コードを読みやすくするために(while文でも同じことをしたい)。とにかく、私は次の正規表現を使用しています。これは、感嘆符の後に小文字が続き、行の最後の閉じ括弧を検索します。

%s/\(.*\)!\([a-z]\)\(.*\))\([^)]+\)/\1\2\3 == false)\4/g

確認をお願いして申し訳ありませんが、なぜ失敗するのか理解できません。

また、この問題を解決し、vim 正規表現を一般的に使用する簡単な方法はありますか?

4

4 に答える 4

1

すでに提示された回答に加えて、コードはリファクタリングが必要なようなにおいがしないと言えます。グローバルな正規表現の置き換えの場合、主な問題は見つけることです

すべてのブール変数

それらをポインターなどと区別します。

于 2014-03-25T14:50:26.317 に答える
1

@Kentが言ったように、これは小さな仕事ではありません。ただし、それだけの単純なケースではif(!a)実行できます。

:%s/\<if(\zs!\(\k\+\)\ze)/\1 == false/c

説明:

  • ifで区切られた単語にあることを確認することから始め\<ます。これにより、関数名の一部ではないことが保証されます。
  • \zs\ze試合の開始と終了をそれぞれ設定します。
  • キーワードクラスを介して変数をキャプチャします\k(これ\wも機能します)。\(\k\+\)
  • 安全性を高めるために、cフラグを使用して各変電所を確認します。

考え:

  • これは、他のコンストラクト用に更新する必要があります。while
  • 余分な空白を変更する必要があるかもしれません。\<if\s*(\s*\zs!\(\k\+\)\ze\s*)
  • [a-z0-9_]マクロのキャプチャの代わりに、\kまたは\wマクロのキャプチャを回避するために使用する場合があります
  • コンストラクトがない場合があります。foo = !a && b;
  • これはfalseケースのみを処理します。行うa == trueことははるかにトリッキーかもしれません

ケースによっては、次のことを行うのが最も安全な場合があります。

:%s/!\([a-z0-9]\+\)/\1 == false/gc
于 2014-03-25T14:31:48.070 に答える