C# 制表符包装的字符串

本文关键字:字符串 包装 制表符 | 更新日期: 2023-09-27 18:32:23

我正在将一个大字符串(大约 100 行)写到文本文件中,并希望将整个文本块设置为选项卡。

WriteToOutput("'t" + strErrorOutput);

我在上面使用的行仅制表符文本的第一行。如何缩进/按 Tab 键键处理整个字符串?

C# 制表符包装的字符串

将所有

换行符替换为换行符,后跟制表符:

WriteToOutput("'t" + strErrorOutput.Replace("'n", "'n't"));
File.WriteAllLines(FILEPATH,input.Split(new string[] {"'n","'r"}, StringSplitOptions.None)
                                 .Select(x=>"'t"+x));
为此,

您必须具有有限的行长度(即<100个字符),此时此问题变得容易。

public string ConvertToBlock(string text, int lineLength)
{
    string output = "'t";
    int currentLineLength = 0;
    for (int index = 0; index < text.Length; index++)
    {
        if (currentLineLength < lineLength)
        {
            output += text[index];
            currentLineLength++;
        }
        else
        {
            if (index != text.Length - 1)
            {
                if (text[index + 1] != ' ')
                {
                    int reverse = 0;
                    while (text[index - reverse] != ' ')
                    {
                        output.Remove(index - reverse - 1, 1);
                        reverse++;
                    }
                    index -= reverse;
                    output += "'n't";
                    currentLineLength = 0;
                }
            }
        }
    }
    return output;
 }

这会将任何文本转换为文本块,该文本块分为长度lineLength行,并且所有文本都以制表符开头并以换行符结尾。

您可以复制字符串以进行输出,将 CRLF 替换为 CRLF + TAB。 并将该字符串写入输出(仍以初始 TAB 为前缀)。

strErrorOutput = strErrorOutput.Replace("'r'n", "'r'n't");
WriteToOutput("'t" + strErrorOutput);

如果您在这里寻找一种将字符串自动换行到一定宽度的方法,并将每一行缩进(就像我一样),这里有一个解决方案作为扩展方法。 大致基于上面的答案,但使用正则表达式将原始文本拆分为单词和空格对,然后重新连接它们,根据需要添加换行符和缩进。 (不检查完整性输入,因此如果需要,您需要添加它)

public string ToBlock(this string text, int lineLength, string indent="")
{
    var r = new Regex("([^ ]+)?([ ]+)?");
    var matches = r.Match(text);
    if (!matches.Success)
    {
        return text;
    }
    string output = indent;
    int currentLineLength = indent.Length;
    while (matches.Success)
    {
        var groups = matches.Groups;
        var nextLength = groups[0].Length;
        if (currentLineLength + nextLength <= lineLength)
        {
            output += groups[0];
            currentLineLength += groups[0].Length;
        }
        else
        {
            if (currentLineLength + groups[1].Length > lineLength)
            {
                output += "'n" + indent + groups[0];
                currentLineLength = indent.Length + groups[0].Length;
            }
            else
            {
                output += groups[1] + "'n" + indent;
                currentLineLength = indent.Length;
            }
        }
        matches = matches.NextMatch();
    }
    return output;
}