2008-09-13 73 views
5

以下是我編寫的用於匹配C/C++代碼中的多行預處理器宏的正則表達式。我絕不是一個正則表達式大師,所以我歡迎任何關於如何讓這個更好的建議。python正則表達式匹配多行預處理器宏

這裏的正則表達式:

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

應該符合這一切:

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

但只有一些本(應該的下一行代碼不匹配:

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

也不應該與單線預處理器宏匹配。

我非常肯定上面的正則表達式的工作原理 - 但正如我所說,可能有更好的方法來做到這一點,我想有辦法打破它。任何人都可以建議嗎?

回答

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. 我靠+是 貪婪,所以我可以用一個簡單的。* $在 年底拿到 的第一行定義不以\
4
start  = r"^\s*#define\s+" 
continuation = r"(?:.*\\\n)+" 
lastline  = r".*$" 

re_multiline_macros = re.compile(start + continuation + lastline, 
           re.MULTILINE) 
結束