如何通过换行符拆分字符串而不丢失连续的多个换行符?

How to split a string by line breaks and not lose multiple line breaks in a row?

我有以下代码用于获取字符串并按换行符将其拆分:

var delimiters = new string[] { "\v", "\v", "\r", "\n" };
string[] split = textWithStyle.Text.Split(
                     delimiters, 
                     StringSplitOptions.RemoveEmptyEntries);

然后我循环遍历拆分数组进行渲染。所以如果我的字符串是:

Today is Monday and the 7th
Tomorrow is Tuesday and the 8th

我得到一个包含 2 个项目的数组:

[0] Today is Monday and the 7th
[1] Tomorrow is Tuesday and the 8th

我刚刚意识到的问题是,如果字符串连续有多个换行符,如:

Today is Monday and the 7th


Tomorrow is Tuesday and the 8th

如果我在文本编辑器中查看,我会在此处看到连续的多个 CRLF,但我的解析代码无法将此用例与单个换行符区分开来,并且上面的代码仍然只会在数组中创建 2 个元素个别行

如何更改我的解析代码,以便如果我连续有多个换行符,它会将除第一个换行符之外的每个换行符添加到数组中。所以如果上面的字符串有 3 个 CRLF,那么我希望我的数组是:

[0] Today is Monday and the 7th
[1] empty string
[2] empty string
[3] Tomorrow is Tuesday and the 8th

如果我简单地删除 StringSplitOptions.RemoveEmptyEntries,那么我最终会得到

[0] Today is Monday and the 7th
[1] empty string
[2] empty string
[3] empty string
[4] empty string
[5] Tomorrow is Tuesday and the 8th

我不想要(因为它的 space 条目比我想要的多)

删除 StringSplitOptions.RemoveEmptyEntries 并删除一些条目,只留下:

 var delimiters = new string[] { "\v", "\v", "\r\n" }; 
 string[] split = textWithStyle.Text.Split( delimiters); 

对于结果数组中的每个空条目,这是一个换行符。

首先,我建议使用 Environment.NewLine 而不是您的构造。通过使用 ("\r", "\n") 你会得到更多的空字符串。

第二次避免StringSplitOptions.RemoveEmptyEntries。要获得所有换行符,您需要指定 StringSplitOptions.None(似乎只有 StringSplitOptionsstring[] 没有重载)。

然后过滤"by hand"。我在这里看不到一个聪明的 linq 单行代码。

        List<string> resultList = new List<string>();
        bool previousEmpty = false;
        foreach (string split in textWithStyle.Text.Split(new[] {Environment.NewLine, "\v"}, StringSplitOptions.None))
        {
            if (!string.IsNullOrEmpty(split))
                previousEmpty = false;
            else if (!previousEmpty)
            {
                previousEmpty = true;
                continue;
            }               

            resultList.Add(split);
        }

        string[] split = resultList.ToArray();

编辑:我不太清楚你是否需要 \r 和 \n 的额外条目。您的示例结果表明。如果是这样,请跳过 Environment.NewLine 部分并使用分隔符。

但是您实际上得到了 "unwanted" 示例结果,因为有 4 个空条目,因为有两个换行符(\r\n\r\n => 4 个条目)。所以你可能想改成new[]{"\v", "\r\n"}。在你的问题中 "\v" 是什么意思?