5

下面是我编写的一个正则表达式,用于匹配 C / C++ 代码中的多行预处理器宏。我绝不是正则表达式专家,所以我欢迎任何关于如何使它变得更好的建议。

这是正则表达式:

\s*#define(.*\\\n)+[\S]+(?!\\)

它应该匹配所有这些:

#define foo(x) if(x) \
doSomething(x)

但只有其中一些(不应该匹配下一行代码:

#define foo(x) if(x) \
doSomething(x)
normalCode();

也不应该匹配单行预处理器宏。

我很确定上面的正则表达式有效 - 但正如我所说,可能有更好的方法来做到这一点,我想有办法打破它。任何人都可以提出任何建议吗?

4

2 回答 2

5

这是我敲出来的一个简单的测试程序:

#!/usr/bin/env python

TEST1="""
#include "Foo.h"
#define bar foo\\
    x
#include "Bar.h"
"""

TEST2="""
#define bar foo
#define x 1 \\
    12 \\
    2 \\\\ 3
Foobar
"""

TEST3="""
#define foo(x) if(x) \\
doSomething(x)
"""

TEST4="""
#define foo(x) if(x) \\
doSomething(x)
normalCode();
"""

import re
matcher = re.compile(r"^[ \t]*#define(.*\\\n)+.*$",re.MULTILINE)

def extractDefines(s):
    mo = matcher.search(s)
    if not mo:
        print mo
        return
    print mo.group(0)

extractDefines(TEST1)
extractDefines(TEST2)
extractDefines(TEST3)
extractDefines(TEST4)

我使用的重新:

r"^[ \t]*#define(.*\\\n)+.*$"

与使用的一种用途非常相似,变化:

  1. [ \t] 避免在定义开始处换行。
  2. 我依赖 + 是贪婪的,所以我可以在最后使用一个简单的 .*$ 来获取不以 \ 结尾的定义的第一行
于 2008-09-13T17:46:14.867 回答
4
start        = r"^\s*#define\s+"
continuation = r"(?:.*\\\n)+"
lastline     = r".*$"

re_multiline_macros = re.compile(start + continuation + lastline, 
                                 re.MULTILINE)
于 2008-09-13T17:53:30.713 回答