我想将一个字符串分成指定最大长度的行,如果可能的话,不拆分任何单词(如果有一个单词超过了最大行长度,那么它就必须被拆分)。
一如既往,我敏锐地意识到字符串是不可变的,最好使用 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/