2

すべてのコメント(「//」で始まり、行末まで)をファイルから削除するプログラムを作成したいと思います。

正規表現を使ってやりたいです。

私はこれを試しました:

    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

4 に答える 4

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"

The output file must be different from the input file, because we're writing to the output while we're still reading from the input. We use the regex to identify comment lines (with optional leading whitespace), and Seq.filter to make sure the comment lines don't get sent to the output file.

Because we never hold the entire input or output file in memory, this function will work on any size file, and it's likely faster than the "read entire file, regex everything, write entire file" approach.

Danger Ahead

This code will not strip out comments that appear after some code on the same line. However, a regular expression is not the right tool for that job, unless someone can come up with a regular expression that can tell the following two lines of code apart and avoid breaking the first one when you strip everything that matches the regex from the file:

let request = WebRequest.Create("http://foo.com")
let request = WebRequest.Create(inputUrl) // this used to be hard-coded
于 2012-06-01T16:40:23.210 に答える
1
let regexComment = new Regex(@"//.*$",RegexOptions.Multiline)
于 2012-06-01T10:11:53.820 に答える
0

気にしないで、私はそれを理解しました。それはすべきだった:

let regexComment = new Regex("//.*\\r\\n")
于 2012-06-01T08:14:30.513 に答える
0

正規表現の文字列が間違っているようです。 "\\/\\/.*\\r\\n"私のために働いた。

于 2012-06-01T08:14:46.780 に答える