C# 在C语言中缩进未缩进代码的应用程序#
我的应用程序应该读取一个C#code样本,该样本是未插入的,然后以编程方式缩进代码。我的做法可能不正确,但仍可能取得部分成果 我可以在找到C# 在C语言中缩进未缩进代码的应用程序#,c#,string,whitespace,indentation,C#,String,Whitespace,Indentation,我的应用程序应该读取一个C#code样本,该样本是未插入的,然后以编程方式缩进代码。我的做法可能不正确,但仍可能取得部分成果 我可以在找到{时设置空格,然后继续为正在读取的其余行保留相同的空间。当再次找到另一个{时,添加空格并继续为其余行保留此新空间。为此,我做了以下操作: private void btn_format_Click(object sender, EventArgs e) { string lineInfo = ""; string
{
时设置空格,然后继续为正在读取的其余行保留相同的空间。当再次找到另一个{
时,添加空格并继续为其余行保留此新空间。为此,我做了以下操作:
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());
我知道代码的上述部分完全是一个错误,但请告诉我如何以正确的方式实现它使用String.Trim()删除行中的所有空白,然后只添加所需的制表符。此外,如果可以避免char.ConvertFromUtf32(32),那么代码的可读性会更好-为什么要编写它而不是“”或者“”?你可以去看看,一个开源VS插件,用于清理代码如果你想解析字符串,你应该使用StringBuilder而不是字符串连接(连接会变慢)。我写了一些代码,来演示如何解析CS或其他代码。这不是一个完整的示例,只是一个基本概念 如果您想了解有关解析器的更多信息,可以阅读
公共静态字符串缩进CSharpCode(字符串代码)
{
const string INDENT\u STEP=“”;
if(string.IsNullOrWhiteSpace(代码))
{
返回码;
}
var result=新的StringBuilder();
var indent=string.Empty;
var lineContent=false;
var stringDefinition=false;
对于(变量i=0;i
Visual Studio内置了这种自动缩进功能。您是否检查过它是否在API中公开了功能?char.ConvertFromUtf32(32)
用于打印一个空格。由于我不想使用添加8个空格的\t,我创建了一个包含3个空格的字符串变量。对,忘记了我的ascii值,也没有编译器。这个(更新的)问题仍然存在。
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();
}