正则表达式谜题:封装结构

Regexp puzzle : encapsulated structures

所以我在这里尝试做所有程序员可能有一天也必须做的事情。

我的代码中有所有这些嵌套宏,我想在每个 #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 */

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

可以在 Notepad++ 中仅使用 正则表达式来完成吗? 太棒了!!!

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

  3. 通过将 ^#endif.* 替换为 #endif 来清除所有现有的 #endif 标记。

  4. 我们只需要关注 #if...#endif 行,因此我们通过将 ^(?!#(if|endif)).* 替换为 ;[=19=] 来忽略所有其他行。所以 ; 是我们的 'ignore' 标记。

  5. 接下来,我们重复修改 #if - #endif 对,它们之间只有忽略的线。
    所以,重复 'Replace All'
    ^#if(.+)\n((;.*\n)*)#endif

    ;#if\n;#endif /* */

    这会将评论应用于所有 #if - #endifs 在最底层的嵌套层,然后用 ; 标记,所以下次点击 'Replace All' 时,它们将被忽略。
  6. 完成后,通过将 ^;(.+?\n) 替换为 来删除忽略标记。

瞧!