使用一点 LINQ 和 Regex 来找到最短的缩进,然后从所有行中删除该数量的字符。
string[] l_lines = {
" public class MyClass",
" {",
" private bool MyMethod(string s)",
" {",
" return s == \"\";",
" }",
" }"
};
int l_smallestIndentation =
l_lines.Min( s => Regex.Match( s, "^\\s*" ).Value.Length );
string[] l_result =
l_lines.Select( s => s.Substring( l_smallestIndentation ) )
.ToArray();
foreach ( string l_line in l_result )
Console.WriteLine( l_line );
印刷:
public class MyClass
{
private bool MyMethod(string s)
{
return s == "";
}
}
该程序将扫描数组中的所有字符串。如果您可以假设第一行缩进最少,那么您可以通过仅扫描第一行来提高性能:
int l_smallestIndentation =
Regex.Match( l_lines[0], "^\\s*" ).Value.Length;
另请注意,这会将制表符 ( "\t"
) 作为单个字符处理。如果同时存在制表符和空格,那么反转缩进可能会很棘手。处理这个问题的最简单方法是在运行上面的代码之前用适当数量的空格(通常是 4 个,尽管各个应用程序可能会有很大差异)替换所有选项卡实例。
也可以修改上面的代码以赋予选项卡额外的权重。到那时,正则表达式不再有多大用处。
string[] l_lines = {
"\t\t\tpublic class MyClass",
" {",
" private bool MyMethod(string s)",
" {",
" \t \t\treturn s == \"\";",
" }",
"\t\t\t}"
};
int l_tabWeight = 8;
int l_smallestIndentation =
l_lines.Min
(
s => s.ToCharArray()
.TakeWhile( c => Char.IsWhiteSpace( c ) )
.Select( c => c == '\t' ? l_tabWeight : 1 )
.Sum()
);
string[] l_result =
l_lines.Select
(
s =>
{
int l_whitespaceToRemove = l_smallestIndentation;
while ( l_whitespaceToRemove > 0 )
{
l_whitespaceToRemove -= s[0] == '\t' ? l_tabWeight : 1;
s = s.Substring( 1 );
}
return s;
}
).ToArray();
打印(假设您的控制台窗口的标签宽度像我的一样为 8):
public class MyClass
{
private bool MyMethod(string s)
{
return s == "";
}
}
您可能需要修改此代码以处理边缘情况,例如零长度行或仅包含空格的行。