2013-05-30 25 views
1

考慮的聲明是這樣的:正則表達式解析C++函數的返回類型(C++的實際子集)

virtual Foo * const operator=(Bar& b); 

virtual Foo * const operator= (Bar& b); // note the optional number of whitespace after the function name 

我想捕捉的Foo * const部分。換句話說,我想匹配字符串開頭,可選的虛擬靜態和開始大括號之間的所有字符,除了大括號之前的最後一個單詞和任意數量的空白。

我想出了以下內容:

 
(?virtual|static)?\s*(?.*?)(?!\s*\() 

但是,這是行不通的。

編輯:一些更多的例子:

 
Input        Capture 
-----        ------- 
void f();       void 
static int Foo();     int 
virtual const int * const   const int * const 
virtual Foo * operator+(Foo& b); Foo * 

回答

1

我也不太清楚,你在找什麼,但如果我這樣做是正確,這可能是你在找什麼:

^(?:virtual|static)?\s*(.*?)(?=\s\w+=) 

並在here上測試。

先行是沒有必要的,但:

^(?:virtual|static)?\s*(.*?)\s\w+= 

否則,如果你想獲得整個Foo * const operator= (一部分,也許這?

^(?:virtual|static)?\s*(.*?)\(

我覺得你不明白負面的先行或非捕獲組。

(?:...)是一個非捕獲組(注意冒號)。

(?!...)是一種負面預測,它可以防止匹配組中的內容。在你的情況下,你寧願選擇一個積極的lookahead來捕獲之前的所有內容,但在這種特殊情況下不需要,因爲簡單的.*\(就足夠了。

編輯:在符合新的測試樣品,有些複雜的正則表達式:

^(?:virtual|static)?\s*(.+?)(?:(?:\s*\w+[\(=\+\?\!])|$) 
+0

不一定有一個'='字符在函數名的末尾,我只是選擇了一個,表明有可能。一個足夠接近的模式來匹配函數名稱將是'[_a-zA-z] \ w + [= \?\ + \!] *',但只是替換'\ s *'和'\('之間的部分不工作 –

+0

@fish你可能會提供更多可能的輸入信息,並說出你想要得到什麼完全一樣的輸出在你的問題? – Jerry

+0

當然,我提供了更多的例子 –