C#正则表达式替换多个换行符

5

我有一个文本文件,其中包含更多或更少的段落。 文本实际上不是单词,而是逗号分隔的数据; 但这并不重要。 文本文件有点像分成了几个部分; 可以有节和子节。 节的划分由多个换行符表示,而子节则由一个换行符表示。

因此,示例数据:

This is the, start of a, section
908690,246246246,246246
246246,246,246246

This is, the next, section,
sfhklj,sfhjk,4626246
4yw2,fdhds5juj,53ujj

所以上面的数据包含两个部分,每个部分有三个子部分。但有时候,在部分之间会有不止一行空行。当这种情况发生时,我想将多个换行符(例如\n\n\n\n)转换为一个\n\n;我认为正则表达式可能是实现此操作的方法。我还可能需要使用不同的换行符标准,如Unix的\n和Windows的\r\n。我认为文件可能包含多个行尾编码。
以下是我想出来的正则表达式;它没有什么特别之处:
Regex.Replace(input, @"([\r\n|\n]{2,})", Enviroment.NewLine + Enviroment.NewLine}

首先,这是一个好的正则表达式解决方案吗?我对正则表达式不是很擅长。

其次,我想将每个部分拆分为字符串数组中的一个元素:

Regex.Split(input, Enviroment.NewLine + Enviroment.NewLine)

有没有一种方法可以将这些步骤结合起来?

我猜你应该先用 Enviroment.NewLine 替换 ([\r\n|\n]) 以保持数据一致性。至于优化,我不知道有什么方法,我猜你不能将它们合并。我猜你走在正确的路上。你可能想设置 RegexOptions.Compiled 以使其更快。 - BrunoLM
2个回答

6

[\r\n|\n]是错误的。这是一个字符类,匹配\r\n|中的一个字符。

通常用于匹配通用行分隔符的习惯用法为(?:\r\n|[\r\n])(?:\n|\r\n?)。这些将匹配\r\n(DOS/Windows)、\r(旧版Macintosh)或\n(Unix/Linux/Mac OS X)。

我会将所有的行分隔符规范化为\n,然后在两个或更多的分隔符上进行分割:

Regex.Split(Regex.Replace(source, @"(?:\r\n|[\r\n])", "\n"), @"\n{2,}")

太棒了,谢谢。正是我要找的。知道我的正则表达式至少有点正确,感觉很好。 - Shawn

0

我将使用String.Split,首先使用双换行符作为分隔符将文本拆分成部分,然后使用单个换行符将每个部分拆分成子部分。 然后你就会得到你想要的数组。你可以使用List<string>对象作为容器,并使用AddRange将从拆分方法返回的数组添加到容器中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接