如何通过换行符拆分字符串而不丢失连续的多个换行符?
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
(似乎只有 StringSplitOptions
的 string[]
没有重载)。
然后过滤"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"
是什么意思?
我有以下代码用于获取字符串并按换行符将其拆分:
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
(似乎只有 StringSplitOptions
的 string[]
没有重载)。
然后过滤"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"
是什么意思?