我的应用程序应该以缩进读取 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());
我知道代码的上述部分是完全错误,但让我知道如何以正确的方式实现它
答案 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),你的代码将更具可读性 - 为什么要写代替“”或“?”