接下来是我编写的正则表达式,用于匹配C/C++代码中的多行预处理器宏.我绝不是一名正则表达大师,所以我欢迎任何关于我如何能做得更好的建议.
这是正则表达式:
\s*#define(.*\\\n)+[\S]+(?!\\)
它应该匹配所有这些:
#define foo(x) if(x) \ doSomething(x)
但只有一部分(不应该匹配下一行代码:
#define foo(x) if(x) \ doSomething(x) normalCode();
并且也不应该匹配单行预处理器宏.
我很确定上面的正则表达式有效 - 但正如我所说,可能有更好的方法,我想有办法打破它.任何人都可以建议吗?
这是一个简单的测试程序,我敲了一下:
#!/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)+.*$"
非常类似于使用的一种用法,改变:
[\ t]为了避免在定义开始时换行.
我依赖于+贪婪,所以我可以使用一个简单的.*$来获得定义的第一行,而不是以\结尾