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