而不是加載整個文件到內存中,並在其上運行一個正則表達式,更快的方法,將處理任何大小的文件,而不內存問題可能是這樣的:
open System
open System.IO
open System.Text.RegularExpressions
// regex: beginning of line, followed by optional whitespace,
// followed by comment chars.
let reComment = Regex(@"^\s*//", RegexOptions.Compiled)
let stripComments infile outfile =
File.ReadLines infile
|> Seq.filter (reComment.IsMatch >> not)
|> fun lines -> File.WriteAllLines(outfile, lines)
stripComments "input.txt" "output.txt"
輸出文件必須與輸入文件不同,因爲我們在輸入時正在寫入輸出。我們使用正則表達式來標識註釋行(帶有可選的前導空白),並使用Seq.filter
來確保註釋行不會發送到輸出文件。
因爲我們從來沒有在內存中保存整個輸入或輸出文件,所以這個函數可以處理任何大小的文件,它可能比「讀取整個文件,正則表達式,寫入整個文件」的方法更快。
前面危險
此代碼不會剝離出在同一行的一些代碼後出現意見。但是,正則表達式不適合用於這項工作,除非有人能夠提出一個正則表達式,可以將以下兩行代碼分開,並避免在從文件中剝離與正則表達式匹配的所有內容時避免打破第一行:
let request = WebRequest.Create("http://foo.com")
let request = WebRequest.Create(inputUrl) // this used to be hard-coded
我不知道你正在處理的約束條件,但我無法想象使用RegEx是一種需求的情況。在你的情況下,使用.StartsWith來測試每個字符串會更簡單,可能更安全。對於後來維護的人來說,這也會更容易。正如我所說,我不知道你的限制,但我認爲在這裏使用RegEx可能會增加不必要的複雜性。 –
除了Onorio的觀點之外,當這些字符不代表代碼註釋時,基於正則表達式的方法將打破任何包含字符「//」的代碼。例如,在諸如URL之類的文字字符串中。 –
@JoelMueller,或者他的代碼在這裏;) – Benjol