如何使用正则表达式去除预处理程序指令

时间:2012-08-06 09:54:52

标签: regex

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

blablabla1blablabla2之外,wx_strc_str的内容应该相同。

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

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

以下是参考页面:

Re: what's the best and quick way to remove all the wx_str and c_str preprocessor

2 个答案:

答案 0 :(得分:3)

搜索

This regex适用于您的示例:

  

\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 选项。

Notepad ++ :替换为:\1wx_str\2。不要忘记选择 . matches newline 选项。


批处理模式

Notepad ++允许以批处理模式查找/替换。

  1. Ctrl + Shift + H 打开“在文件中查找”对话框。
  2. 将正则表达式复制粘贴到“查找内容”框中。
  3. 将替换品(\1wx_str\2)复制粘贴到“替换为”框中。
  4. 指定目录以在其中查找/替换。
  5. 在搜索模式组框中选择正则表达式
  6. 检查. matches newline框。
  7. 点击“查找全部”按钮查看匹配项。
  8. 如果您要更换所有内容,请点击“替换文件”按钮。

答案 1 :(得分: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

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