在C#中缩进未缩进代码的应用程序

时间:2012-08-12 12:17:08

标签: c# string whitespace indentation

我的应用程序应该以缩进读取 C#代码示例,然后以编程方式缩进代码。我这样做的方式可能不正确,但仍然可以取得部分结果。

我可以在找到{时设置空格,然后继续使用相同数量的空间来读取剩余的行。当再次找到另一个{时,添加空格并继续使用这个新空间用于其余行。为此,这就是我所做的:

    private void btn_format_Click(object sender, EventArgs e)
    {
        string lineInfo = "";
        string fl = "";
        string ctab= char.ConvertFromUtf32(32)+char.ConvertFromUtf32(32)+char.ConvertFromUtf32(32);
        foreach (string line in txt_codepage.Lines) // text_codepage is a textbox with code
        {
            if (line.Contains("{"))
            {
                string l = line.Replace("{", ctab+"{");
                lineInfo = lineInfo + (l + "\n");
                fl = fl + ctab;
                ctab = ctab + ctab;
            }
            else
            {
                lineInfo = lineInfo + (char.ConvertFromUtf32(32)+fl+ line + "\n");
            }

我可以在这里达到我想要的适当缩进。现在,当我找到}时,我应该执行相反的过程,但不幸的是,字符串是不可能的。我的意思是相反的过程:

            if (line.Contains("}"))
            {
                string l = line.Replace(ctab + "}", "}");
                lineInfo = lineInfo + (l + "\n");
                fl = fl - ctab;
                ctab = ctab - ctab;
            }
            else
            {
                lineInfo = lineInfo - (char.ConvertFromUtf32(32) + fl + line + "\n");

            }
        }
        MessageBox.Show(lineInfo.ToString());

我知道代码的上述部分是完全错误,但让我知道如何以正确的方式实现它

3 个答案:

答案 0 :(得分:2)

如果你想要解析字符串,你应该使用StringBuilder而不是字符串连接(连接是慢的)。我写了一些代码,以演示如何解析CS或其他代码。它不是一个完整的例子,只是一个基本概念。

如果您想了解有关解析器的更多信息,请阅读Compilers: Principles, Techniques, and Tools

public static string IndentCSharpCode(string code)
{
    const string INDENT_STEP = "    ";

    if (string.IsNullOrWhiteSpace(code))
    {
        return code;
    }

    var result = new StringBuilder();
    var indent = string.Empty;
    var lineContent = false;
    var stringDefinition = false;

    for (var i = 0; i < code.Length; i++)
    {
        var ch = code[i];

        if (ch == '"' && !stringDefinition)
        {
            result.Append(ch);
            stringDefinition = true;
            continue;
        }

        if (ch == '"' && stringDefinition)
        {
            result.Append(ch);
            stringDefinition = false;
            continue;
        }

        if (stringDefinition)
        {
            result.Append(ch);
            continue;
        }

        if (ch == '{' && !stringDefinition)
        {
            if (lineContent)
            {
                result.AppendLine();
            }

            result.Append(indent).Append("{");

            if (lineContent)
            {
                result.AppendLine();
            }

            indent += INDENT_STEP;
            lineContent = false;

            continue;
        }

        if (ch == '}' && !stringDefinition)
        {
            if (indent.Length != 0)
            {
                indent = indent.Substring(0, indent.Length - INDENT_STEP.Length);
            }

            if (lineContent)
            {
                result.AppendLine();
            }

            result.Append(indent).Append("}");

            if (lineContent)
            {
                result.AppendLine();
            }


            lineContent = false;

            continue;
        }

        if (ch == '\r')
        {
            continue;
        }

        if ((ch == ' ' || ch == '\t') && !lineContent)
        {
            continue;
        }

        if (ch == '\n')
        {
            lineContent = false;
            result.AppendLine();

            continue;
        }

        if (!lineContent)
        {
            result.Append(indent);
            lineContent = true;
        }

        result.Append(ch);
    }

    return result.ToString();
}

答案 1 :(得分:1)

你可以去看看codemaid,一个开源的VS加入来清理代码

答案 2 :(得分:0)

使用String.Trim()从行中删除所有空格,然后只添加所需的选项卡。此外,如果你可以避免使用char.ConvertFromUtf32(32),你的代码将更具可读性 - 为什么要写代替“”或“?”