gpt4 book ai didi

c# - 将字符串拆分为最大长度的行而不打断单词的最佳方法

转载 作者:可可西里 更新时间:2023-11-01 08:55:42 27 4
gpt4 key购买 nike

我想将一个字符串分成指定最大长度的行,如果可能的话,不拆分任何单词(如果有一个单词超过了最大行长度,那么它就必须被拆分)。

一如既往,我敏锐地意识到字符串是不可变的,最好使用 StringBuilder 类。我见过将字符串拆分为单词然后使用 StringBuilder 类构建行的示例,但下面的代码对我来说似乎“更简洁”。

我在描述中提到“最好”而不是“最有效”,因为我也对代码的“ Eloquent ”感兴趣。字符串永远不会很大,一般分成两三行,也不会出现几千行的情况。

下面的代码真的很糟糕吗?

private static IEnumerable<string> SplitToLines(string stringToSplit, int maximumLineLength)
{
stringToSplit = stringToSplit.Trim();
var lines = new List<string>();

while (stringToSplit.Length > 0)
{
if (stringToSplit.Length <= maximumLineLength)
{
lines.Add(stringToSplit);
break;
}

var indexOfLastSpaceInLine = stringToSplit.Substring(0, maximumLineLength).LastIndexOf(' ');
lines.Add(stringToSplit.Substring(0, indexOfLastSpaceInLine >= 0 ? indexOfLastSpaceInLine : maximumLineLength).Trim());
stringToSplit = stringToSplit.Substring(indexOfLastSpaceInLine >= 0 ? indexOfLastSpaceInLine + 1 : maximumLineLength);
}

return lines.ToArray();
}

最佳答案

即使这篇文章已有 3 年历史,我仍想使用 Regex 提供更好的解决方案来完成相同的任务:

如果你想拆分字符串然后使用要显示的文本你可以使用这个:

public string SplitToLines(string stringToSplit, int maximumLineLength)
{
return Regex.Replace(stringToSplit, @"(.{1," + maximumLineLength +@"})(?:\s|$)", "$1\n");
}

另一方面,如果你需要一个集合,你可以使用这个:

public MatchCollection SplitToLines(string stringToSplit, int maximumLineLength)
{
return Regex.Matches(stringToSplit, @"(.{1," + maximumLineLength +@"})(?:\s|$)");
}

注意事项

记得导入正则表达式(using System.Text.RegularExpressions;)

您可以在匹配上使用字符串插值:
$@"(.{{1,{maximumLineLength}}})(?:\s|$)"

MatchCollection 的工作方式几乎类似于Array

带解释的匹配示例 here

关于c# - 将字符串拆分为最大长度的行而不打断单词的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22368434/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com