使用Regex从文件中删除注释

时间:2012-06-01 07:56:23

标签: regex f#

我想编写一个程序,从文件中删除所有注释(以“//”开头,直到行尾)。

我想用正则表达式来做。

我试过了:

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

但它不起作用......

您能否向我解释原因,并给我一些有用的建议(最好使用正则表达式..)?

谢谢:)

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

没关系,我明白了。应该是:

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

答案 3 :(得分:0)

你的正则表达式字符串似乎是错误的。 "\\/\\/.*\\r\\n"为我工作。