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);
我的输入示例文本文件
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);