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_str和除外c_str

看到这里,有人说可以用正则表达式处理,但我不知道,你能帮帮我吗?谢谢。

编辑:我只想剥离#else 分支,只保留第一个分支内容。

这是参考页面:

回复:删除所有 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$2。不要忘记选择dotall选项。

记事本++:替换为:\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 将整个文件粉碎成一个长字符串;

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

这不会尝试考虑空格的变化,也不会处理嵌套的预处理器指令。如果您的匹配项始终是单行,则可以简化。

于 2012-08-06T10:34:04.100 回答