2012-04-11 59 views
4

對於可以計算源文件的算法,需要使用特定描述(不會被類似正則表達式等過於模糊的描述)混合換行符:使用「混合換行符類型」對行數進行計數的算法

'\r', '\n', '\r\n', '\n\r' 

我目前有以下算法。是否可以?:

  1. 我確保始終處於第一個換行字符的「邊界」。

  2. 在那個事件中,我比較當前的字節字符。

3.1。如果它是'\ n',我把它算作結束當前行並開始一個新行。

3.2。如果它是'\ r',我讀下一個字符(如果不超過文本緩衝區的限制),看看它是否是'\ n'。如果是,我把它算作'\ r \ n'換行符。

3.3。如果它是'\ r',並且下一個字符不是'\ n',我把它算作'\ r'生成的換行符;將當前行標記爲結束並將其計爲新行的開始。


如果它是有用的,我需要它來嘗試生產對整個Web瀏覽器粘貼源文件,這些文件拷貝/更大的「便攜性」,和/或具有不同類型的換行符的幾個文件追加,並且我有解析工具,我想確保在所有情況下都具有正確和強大的行爲。

+1

如果你的問題是「這個算法好嗎?」,那麼是的,這是完全合理的,也是攻擊這個問題最直接的方法(IMO)。 – prelic 2012-04-11 20:29:43

+1

你真的應該學習一個正則表達式是什麼。你剛剛做的是將正則表達式「編譯」爲有限狀態機。 – 2012-04-11 20:30:13

+1

@KristopherMicinski - 因爲他表示他不想使用RE來實現這種方法,所以假設他知道RE是什麼是合理的,並且正在選擇(或者某人正在爲他選擇)而不使用它們。 – prelic 2012-04-11 20:31:29

回答

2

該算法應覆蓋99.999%的所有情況。

您應該可以在二進制模式而不是文本模式下閱讀源代碼,以確保沒有I/O層試圖通過將其中的一些轉換爲'\n'來幫助您。

您沒有指定您正在使用哪種語言。請注意,在C和C++中,'\n'與其他轉義字符不同,因爲它不保證具有特定的值。確實,在大多數實現中,它將映射到ASCII換行符,但使用類似'\x0A'的代碼更安全,更明確地保持代碼的可移植性。

換行符還有其他一些方案,但它們非常少見。 Unicode中有一個NEL字符,它與原來在EBCDIC中的文件(我認爲)是往返兼容的。 Unicode還引入了LINE SEPARATORPARAGRAPH SEPARATOR,您可能還想將其作爲換行符處理。但這些非常罕見,並且可能很難處理,因爲它們不在ASCII範圍內,因此您需要知道您的編碼並準備好處理這些問題。