2012-04-27 80 views
1

我想找到一個正則表達式來匹配C++頭文件中的非虛擬的方法聲明。我在大多數情況下都能正常工作,但是如果在虛擬之後有一個換行符,並且方法聲明在下一行,我的正則表達式就會匹配它,這不是我想要的。因此,我需要正則表達式引擎回溯到上一行並檢查虛擬關鍵字。這裏有一個簡單的例子:匹配正則表達式模式匹配非虛擬的C++方法聲明

源文件片段:

void Process(char* name, int val); // Should match, this one works 
virtual char* GetName(); // Should not match since it is virtual, this one works 
virtual 
     flag_type SetValue(uint8 resourceIndex, char* name); // Should not match, but this line matches since virtual is on previous line! 

這裏是我的正則表達式表達: (^\s*\w+\**(?<!virtual)\s+\w+\s*\()(\s*\w+\**\s+\**\w+,?)*\s*\)\s*;

+0

您的想法存在一個邏輯缺陷:您認爲每個聲明至少需要一行,但事實並非如此。如果你有'void x(); void y();'在同一行上,這在C++中是完全可以接受的,你只會識別第一個函數,而不是第二個函數。 – 2012-04-27 17:39:24

+0

感謝您的輸入。我意識到這在任何情況下都行不通,並且不必,但我試圖讓這個例子變得簡單。忽略這個缺陷,如何在前一行的virtual關鍵字前面使正則表達式不匹配? – timohayes 2012-04-27 17:59:29

+0

我發現了一些適用於我的東西,包括Emanuele指出的缺陷(儘管它也會在註釋行中匹配): '\ b(?<!virtual \ s +)\ w + \ ** \ s + \ w + \ S * \((\ S * \ W + \ ** \ S + \ ** \ W + ,?)* \ S * \)\ S *;' – timohayes 2012-04-27 18:31:34

回答

0

我發現的東西,對我的作品,包括缺陷所指出的埃馬努埃萊(雖然它也會在註釋行中匹配):\b(?<!virtual\s+)\w+\**\s+\w+\s*\((\s*\w+\**\s+\**\w+,?)*\s*\)\s*;