2012-08-23 42 views
2

對於與工具的合併,我只需要比較源代碼行的非註釋部分。過濾器c註釋的正則表達式

所以我嘗試創建一個檢測實際代碼的過濾器,即匹配所有文本的正則表達式,其中除了評論。

也許是這樣的:

^.*(?!((/\**([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*))) 

回答

1

這人會做的事:

(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*) 

來源:http://ostermiller.org/findcomment.html

或使用非貪婪匹配:(/\*([\r\n]|.)*?\*/)|(//.*)

+0

這沒有幫助。我需要排除評論。 – LmaBach

+0

@LmaBach在比較文件之前不能剝離它們嗎? –

+0

不,因爲我只需要在合併視圖中忽略註釋。但在結果我想要評論回來。 – LmaBach

0

胺的答案是正確的,但你也可以找到的任何意見,並從字符串中刪除:

此正則表達式會給你所有評論:

(/\*.*?\*/)|//.*?\n 

這將替換與匹配「 「(如果你使用C++):

std::string str2 = std::tr1::regex_replace(string, regex, ""); 
+0

STL正則表達式不關心多行字符串嗎? –

+0

我需要用一個表達式來否定「查找所有評論」。 – LmaBach

0

也許你的編譯器可以提供幫助。有些人可能會有一個選項來預處理源文件並刪除註釋。也許預處理器可以製作成只有條評論。這將是Unix的一種方式,讓一個工具正確地做一件事 - C預處理器知道評論是什麼(而正則表達式是解析的一種方式,IMNSHO)。

作爲第二種選擇,用lexflex編寫詞法分析器來識別註釋很容易。網上應該有很多例子。任何搜索引擎都會產生大量的點擊。

+0

我使用keil C51編譯器,它沒有這種可能性。要麼我可以編寫一個程序,在合併之前刪除註釋。但是這會產生比解決問題更多的問題,因爲我不想放棄合併結果中的註釋。 – LmaBach