首页 文章

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

提问于
浏览
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

除了 wx_strc_str 之外, blablabla1blablabla2 的内容应该相同 .

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

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

这是参考页面:

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

2 回答

  • 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 选项 .

    批处理模式

    记事本允许以批处理模式查找/替换 .

    • 按Ctrl Shift H打开“ Find in Files ”对话框

    • 将正则表达式复制粘贴到“ Find what ”框 .

    • 将替换( \1wx_str\2 )上方的复制粘贴到“ Replace with ”框中 .

    • 指定 Directory 以在其中查找/替换 .

    • 在搜索模式组框中选择 Regular Expression .

    • 检查 . matches newline 框 .

    • 点击“ Find All ”按钮查看匹配项 .

    • 当您确定要更换所有内容时,单击“ Replace in Files ”按钮 .

  • 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
    

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

相关问题