繁体   English   中英

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结尾的空格的空行,使各行之间没有间隙。

为此,您可以完全避免使用 Regex,我强烈建议您这样做。

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

因此,您的代码应该是:

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

问题的关键是正则表达式包含无关的空白,并且不表现为“三个或更多”量词。 只需不要在大括号内放置空格:

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

还要考虑:

  • 使用\\s而不是匹配一个空格
  • 不要放[\\r\\n]因为它的意思是“CR 或 LF 之一”所以如果你的文件有 CRLF 它将匹配 CR 并删除它而不是 LF 并且你的文件仍然会有新行但已损坏/混合行结尾。 正确的正则表达式是匹配 0 或 1 CR 后跟 1 LF
  • 根据 Pluto 的评论,您可以使用插入符号开始您的正则表达式,以防止匹配包含某些文本然后以 3 个或更多空格结尾的行: ^\\s{3,}\\r?\\n - 请注意,您还需要启用多行正则表达式选项,以便正则表达式引擎将每一行文本视为单独的输入- 现在它将整个输入视为一个字符串,因此 ^ 仅适用于文件的开头而不适用于每一行的开头
  • 或者,您可以使用正面查找来确保仅匹配以换行符开头的空格序列。 前面的换行符不是匹配的一部分,因此不会被替换: (?<=\\n)\\s{3,}\\r?\\n 这样做的缺点是它不能匹配文件的第一行,所以我们需要另一个扩展名,比如“匹配输入的开头或换行符,然后是 3 个以上的空格,然后是 CR/CRLF”即: (^|(?<=\\n))\\s{3,}\\r?\\n

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM