1

FI には、次のようなコード スニペットを含む多くのコードがあります。

#if wxCHECK_VERSION(2, 9, 0)
Codef( _T("%AAppend(%t)"), ArrayChoices[i].wx_str());
#else
Codef( _T("%AAppend(%t)"), ArrayChoices[i].c_str());
#endif

しかし、コードをクリーンアップしたい

Codef( _T("%AAppend(%t)"), ArrayChoices[i].wx_str());

つまり、プリプロセッサ ディレクティブを取り除き、最初のブランチだけを残す必要があります。

一致条件は次のとおりです。

#if wxCHECK_VERSION(2, 9, 0)
blablabla1
#else
blablabla2
#endif

との内容はblablabla1、 とを除いてblablabla2同じでなければなりません。wx_strc_str

ここを参照してください。誰かが正規表現で処理できると言っていましたが、わかりません。助けてもらえますか? ありがとう。

編集: #else ブランチを取り除き、最初のブランチの内容のみを保持したいだけです。

参照ページは次のとおりです。

Re: wx_str および c_str プリプロセッサをすべて削除する最善かつ迅速な方法は何ですか?

4

2 に答える 2

3

探す

この正規表現はあなたの例で機能します:

\s+#if wxCHECK_VERSION\(2\, 9\, 0\)\s*(.*?)wx_str([^\r\n]*?)\s*#else\s*(\1)c_str(\2)\s*#endif


置換

Regexr.com : に置き換えます$1wx_str$2dotallオプションを選択することを忘れないでください。

メモ帳++ : に置き換えます: \1wx_str\2. . matches newlineオプションを選択することを忘れないでください。


バッチモード

Notepad++ を使用すると、バッチ モードで検索/置換できます。

  1. + +を押して「ファイルから検索」ダイアログを開きます。CtrlShiftH
  2. 上記の正規表現をコピーして「検索対象」ボックスに貼り付けます。
  3. \1wx_str\2上記の置換 ( ) をコピーして [置換] ボックスに貼り付けます。
  4. その中で検索/置換するディレクトリを指定します。
  5. [検索モード] グループ ボックスで[正規表現]を選択します。
  6. チェック. matches newlineボックスをオンにします。
  7. [すべて検索] ボタンをクリックして一致を表示します。
  8. すべてを置換する場合は、[ファイルで置換] ボタンをクリックします。
于 2012-08-06T10:39:58.977 に答える
1

多くの単純な正規表現ツールは、複数行にわたるマッチングをサポートしていません。単純なスクリプトを作成するawksed、Perl を使用してファイル全体を 1 つの長い文字列に分割することができます。

perl -0777pe 's/^#if wxCHECK_VERSION\(2, 9, 0\)\n(.*?\n)(?:#else\n.*?\n)?#endif\n/\1/gsm' input.c >fixed.c

これは、空白のバリエーションを考慮しようとせず、ネストされたプリプロセッサ ディレクティブを処理しません。一致が常に 1 行である場合は、単純化できます。

于 2012-08-06T10:34:04.100 に答える