而不是加载整个文件到内存中,并在其上运行一个正则表达式,更快的方法,将处理任何大小的文件,而不内存问题可能是这样的:
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