2012-06-01 39 views
2

我想編寫一個程序,從文件中刪除所有註釋(以「//」開頭,直到行尾)。使用Regex從文件中刪除註釋

我想用正則表達式來做。

我嘗試這樣做:

let mutable text = File.ReadAllText("C:\\a.txt") 
    let regexComment = new Regex("//.*\\r\\n$") 
    text <- regexComment.Replace(text, "") 
    File.WriteAllText("C:\\a.txt",text) 

但它不工作...

能否請您給我解釋爲什麼,並給我一些建議,以東西做的工作(使用正則表達式最好..)?

謝謝:)

+1

我不知道你正在處理的約束條件,但我無法想象使用RegEx是一種需求的情況。在你的情況下,使用.StartsWith來測試每個字符串會更簡單,可能更安全。對於後來維護的人來說,這也會更容易。正如我所說,我不知道你的限制,但我認爲在這裏使用RegEx可能會增加不必要的複雜性。 –

+0

除了Onorio的觀點之外,當這些字符不代表代碼註釋時,基於正則表達式的方法將打破任何包含字符「//」的代碼。例如,在諸如URL之類的文字字符串中。 –

+0

@JoelMueller,或者他的代碼在這裏;) – Benjol

回答

1
let regexComment = new Regex(@"//.*$",RegexOptions.Multiline) 
+0

我希望你的代碼不包含任何文字恰好在其中有url的字符串。使用這個正則表達式來去除註釋會產生如下代碼的散列:'let request = WebRequest.Create(「http://foo.com」)' –

+0

@JoelMueller - (如前所述),您應該對cookya說。 – BLUEPIXY

+0

你將需要檢查它是否包含一個字符串文字必須嚴格處理。 – BLUEPIXY

0

沒關係,我想通了。它應該是:

let regexComment = new Regex("//.*\\r\\n") 
0

你的正則表達式的字符串似乎是錯誤的。 "\\/\\/.*\\r\\n"爲我工作。

+0

中分割任何類型的字符串非常感謝:) – cookya

4

而不是加載整個文件到內存中,並在其上運行一個正則表達式,更快的方法,將處理任何大小的文件,而不內存問題可能是這樣的:

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