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分支,只保留第一个分支内容。
以下是参考页面:
Re: what's the best and quick way to remove all the wx_str and c_str preprocessor
答案 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 ++允许以批处理模式查找/替换。
\1wx_str\2
)复制粘贴到“替换为”框中。. matches newline
框。答案 1 :(得分:1)
许多简单的正则表达式工具不支持多行匹配。您可以创建一个简单的awk
或sed
脚本,或使用Perl将整个文件粉碎成一个长字符串;
perl -0777pe 's/^#if wxCHECK_VERSION\(2, 9, 0\)\n(.*?\n)(?:#else\n.*?\n)?#endif\n/\1/gsm' input.c >fixed.c
这不会尝试考虑空白的变化,也不会处理嵌套的预处理程序指令。如果您的匹配始终是一行,则可以简化。