我有一個字符串,可能包括或不包括C++註釋(多林和單行),我需要去除這些註釋才能夠使用該字符串。我目前的想法是使用NSScanner來做到這一點 - 找到打開和關閉多行註釋的位置,並刪除該部分字符串,並找到打開一行註釋和EOL字符的位置,並刪除該部分字符串。使用NSScanner從字符串中刪除註釋?
你會這樣做嗎?你會採取什麼做法?如果它很重要,字符串可能會有幾兆字節的大小,所以性能是一個問題。
我有一個字符串,可能包括或不包括C++註釋(多林和單行),我需要去除這些註釋才能夠使用該字符串。我目前的想法是使用NSScanner來做到這一點 - 找到打開和關閉多行註釋的位置,並刪除該部分字符串,並找到打開一行註釋和EOL字符的位置,並刪除該部分字符串。使用NSScanner從字符串中刪除註釋?
你會這樣做嗎?你會採取什麼做法?如果它很重要,字符串可能會有幾兆字節的大小,所以性能是一個問題。
我的解決辦法:
通過串使用NSScanner轉到並標記每個多線的位置和單一評論和所有字符串(單引號和雙引號之間的任何內容)。將位置存儲在代表每個項目範圍的NSValues數組中。
然後迭代評論數組,確保每個評論不在一個字符串內。檢查這一點的方法是確保每個註釋的位置不大於每個字符串的位置,並且註釋的位置不落入每個字符串的位置+長度。
和瞧。任何不屬於的內容都可以安全地刪除,因爲這是一個有效的評論。
從this thread,我認爲最好的建議是通過C++預處理器運行字符串。
不要忘記跟蹤引號。測試用例:
"/*Ceci n'est pas une commentaire*/"
'/**/'
鍵(Mac OS/Mac OS X的OSType
文字)'//!\n'
"This string does not contain a // comment"
在所有這些情況下,你不應該檢測評論。
反過來也是如此:
//Ceci n'est pas une "string"
/*This comment does not contain an OS'Type' literal*/
是的,我知道。誰說軟件很簡單? – ruipacheco 2009-11-12 17:30:46
雖然如果字符串也有'#include','#define','#etc'指令,可能會有不良的副作用。 – mob 2009-11-11 17:34:27
我的用戶可能沒有在他們的系統上安裝開發人員工具。 – ruipacheco 2009-11-11 17:38:53