Regexp拼图:封装结构

时间:2017-06-20 11:55:36

标签: c regex macros preprocessor

所以在这里,我试图做一些程序员可能不得不做的事情。

我在我的代码中有所有那些嵌套的宏,我想在每个#endif旁边发表评论#if它关闭 - 如果还没有评论。正则表达式可以帮我吗?直到现在*和+在Notepad ++中太贪心,即使我使用了理论上的懒惰版本*?和+? ...

例如这个

#if A

Code

#if B

Code

#if C

Code

#endif

Code

#endif /* B */

Code

#endif

进入这个

#if A

Code

#if B

Code

#if C

Code

#endif /* C */

Code

#endif /* B */

Code

#endif /* A */

1 个答案:

答案 0 :(得分:1)

这可以用一个正则表达式完成吗?不,不!

可以使用正则表达式在Notepad ++中完成吗? HELL YEAH !!!

  1. 关闭$1,$2
  2. 将所有. matches newline替换为\r\n。这使得正则表达式在Windows上更加简单。如果需要,您可以稍后再更改。

  3. \n替换为#endif,清除所有现有的^#endif.*标记。

  4. 我们只需要关注#endif#if...行,因此我们会将#endif替换为^(?!#(if|endif)).*来忽略所有其他行。因此;$0是我们的“忽略”标记。

  5. 接下来,我们反复更改; - #if对只忽略它们之间的行。
    因此,反复'全部替换'
    #endif

    ^#if(.+)\n((;.*\n)*)#endif

    这适用于所有;#if$1\n$2;#endif /* $1 */的评论 - 最低嵌套级别的#if,然后使用#endifs标记它们,因此下次点击“全部替换”时,系统会忽略它们。
  6. 完成后,将;替换为^;(.+?\n),删除忽略标记。
  7. VOILA!