2012-06-01 31 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