[英]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^\\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.