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

标签 c# string split stringbuilder

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

一如既往,我敏锐地意识到字符串是不可变的,最好使用 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/

相关文章:

c# - Antlr 生成的类对内部的访问修饰符

c# - Crystal Reports ActiveX Viewer 在 VB6/.NET App Windows 7 中导致内存不足异常

c# - 根据从数据库读取的文本值检查 RadioButtonList 中的单选按钮

c# - 使用 System.IO.BinaryWriter 写入字符串与字符数组的区别

python - 如何将依赖树的输出解析为扁平结构

MySQL选择21岁以下的男性和女性

c# - 在媒体播放器中播放下一首歌曲的命令是什么?

swift - 为什么String的字节是: and cString: initializers give different results here?

java - 如何按字符位置拆分字符串?

JavaScript - String.split() 但对于数组?