c# regex.replace 需要替换3个或更多空格

c# regex.replace need to replace 3 or more spaces

我的输入示例文本文件

92721662,5819.53,2019 - 10 - 10,04332977,5938.30,.00,118.77 -

92721664,5510.56,2019 - 10 - 10,04332978,5623.02,.00,112.46 -

92730321,22805.90,2019 - 10 - 15,04354360,23350.20,.00,544.30 -

我试过的最后一个正则表达式是:

var requestbody3 = Regex.Replace(requestbody2, @" { 3 ,}[\r\n]", "");

其中 requestbody2 是来自 "testinput.txt" 文件的 File.ReadAllText() 的结果

目标是仅删除包含 3 个或更多空格并以 \r\n 结尾的空白行,使各行之间没有间隙。

问题的症结在于正则表达式包含无关的白色 space 并且不表现为 "three or more" 量词。只需 不要 将 space 放在大括号内:

//three or more spaces followed by windows or unix newline
" {3,}\r?\n"

另请考虑:

  • 使用\s代替</code>来匹配space</li> <li>不要放 <code>[\r\n] 因为它意味着 "one of CR or LF" 所以如果你的文件有 CRLF 它将匹配 CR 并删除它但不是 LF 并且你的文件仍然会有新行但是corrupt/mixed 行结尾。正确的正则表达式是匹配 0 或 1 CR 后跟 1 LF
  • 根据 Pluto 的评论,您可以使用插入符号开始您的正则表达式,以防止匹配包含一些文本的行然后以 3 个或更多 space 结尾:^\s{3,}\r?\n - 请注意 您还需要启用多行正则表达式选项,以便正则表达式引擎将每一行文本视为单独的输入 - 现在它将整个输入视为一个字符串,因此 ^ 仅适用于文件不是每行的开头
  • 或者,您可以使用正向后视来确保仅匹配以换行符开头的 space 序列。前面的换行符不是匹配项的一部分,因此不会被替换:(?<=\n)\s{3,}\r?\n。这样做的缺点是它无法匹配文件的第一行,所以我们需要另一个扩展名,比如 "match the start of input or a newline, followed by 3+ spaces, followed by CR/CRLF" 即:(^|(?<=\n))\s{3,}\r?\n

矫枉过正,但这是一次不错的学习之旅。也许考虑使用不使用正则表达式的建议路线之一:)

您可以为此完全避免正则表达式,我强烈建议这样做。

不要将文件作为一个巨大的字符串来读取,而是使用内置方法获取行:File.ReadLines()。然后要删除空行,您只需使用 LINQ。

所以你的代码应该是:

IEnumerable<string> lines = File.ReadLines("testinput.txt").Where(!string.IsNullOrWhiteSpace);