2010-02-02 26 views
0

我喜歡做的是去除例如具有特定詞的所有功能,如果字是「蘋果」:如何匹配功能代碼塊的正則表達式

void eatapple() 
{ 
// blah 
// blah 
} 

我想刪除所有代碼從'void'到'}'。 我試過是:

^void.*apple(.|\n)*} 

但它花了很長的時間,我覺得有什麼錯在這裏。

我正在使用Visual Studio。謝謝。

回答

0

終於做到了。

^void.*(a|A)pple\(\)\n\{\n((\t.*\n)|(^$\n))*^\} 
0

功能塊不規則,所以在這種情況下使用正則表達式是一個壞主意。

如果你真的有很多功能需要刪除(不止你可以手動刪除(提示你的代碼庫有問題,但我離題了)),那麼你應該寫一個快速括號計數解析器而不是試圖在這種情況下使用正則表達式。

它應該很容易,特別是如果你可以假設大括號已經平衡。閱讀令牌,找到與「apple」相匹配的一個,然後繼續前進,直到到達與緊跟在「apple」令牌之後的那個支架相匹配的支架。刪除之間的一切。

+0

@Welbog,我不認爲計算花括號是一個簡單的程序來編寫。如果必須沒有錯誤,程序必須能夠像編譯器一樣理解源代碼。 – Codism 2010-02-02 18:22:49

+0

@Codism:計數大括號很簡單。你只需要留心評論和字符串文字中的花括號。你說得對,爲了沒有錯誤,你需要爲它編寫一個上下文無關的解析器,但這是這個任務的複雜程度。只要沒有陷阱,支架櫃檯應該沒問題。 – Welbog 2010-02-02 18:29:33

0

從理論上講,常規語言無法表達由上下文無關語法描述的句子。如果這是一次性工作,爲什麼不手動做呢。

0

切換到VI。然後,您可以選擇大括號並按d%刪除該部分。

+0

我愛六。但我不知道那一個。謝謝 – 2010-02-02 18:54:48

+0

百分號移動到匹配大括號,括號和括號。 – 2010-02-02 19:25:53

2

澄清鄭某的最終解決,我認爲這是非常聰明的:它的工作原理,但它取決於代碼一個非常特殊的方式被格式化。但沒關係,因爲大多數IDE都可以強制執行特定的格式標準。如果我可以給出一個相關的例子 - 那把我帶到這裏的問題 - 我希望找到的形式表達(在Java中)

if (DEBUG) { 
    // possibly arbitrary statements or blocks 
} 

其中,是的,在技術上並不正規,但我跑了Eclispe的在文件中的代碼格式化,以確保他們都必然這個樣子(我公司一貫的首選代碼風格):

if (DEBUG) { 
    statement(); 
    while (whatever) { 
    blahblahblah(etc); 
    } 
    // ... 
} 

,然後找這個(這是Java的正則表達式的語法,當然)

^(\s*)if \(DEBUG.*(?:\n\1 .*)*\n\1\} 

做了詭計。