【发布时间】:2017-06-20 11:55:36
【问题描述】:
所以我在这里尝试做一些所有程序员可能有一天也必须做的事情。
我的代码中有所有这些嵌套的宏,我想在每个 #endif 旁边添加注释,如果它关闭的话 - 如果还没有注释。正则表达式可以为我做到这一点吗?直到现在 * 和 + 在 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 */
【问题讨论】:
-
正则表达式无法处理嵌套结构。即使有回溯扩展,我也不确定这是否可行。
-
一般来说不可能,因为这不是regular language。证明它的一种方法是,在一般情况下,您无法用有限数量的状态解析它。
-
如果您使用的是 Notepad++,为什么不用 Notepad++ 标记呢? NPP 正则表达式风格是 Boost,它可以处理递归。
-
因此,正则表达式不是解决方案,但可以通过简单的perl 脚本(甚至一些 C 代码)来解决。 -- @WiktorStribiżew 有趣的功能,虽然这不再是“常规”;)
-
这样的 Vim 宏:
:set nowrapscan^M1GO?^#if^V^M3l"ay$%:s,endif.*$,endif /*^V^Ra */,^V^M%@b^[0"by$ddG@b只需将其拉入缓冲区并执行即可。 ^V, ^M, ^R 和 ^[ 是 ctrl-那个字符
标签: c regex macros preprocessor