我很难找到一个合适的模式来替换字符串本身内引号之外的字符,
例子 :
string Code = "string a = \"David\";";
或者 :
string CodeLine = "if(Code==\"*This+is-string*\"){int a=b*c;}";
替换后的输出应该是这样的:
"if( Code == \"*This+is-string*\" )\n{\nint a = b * c;\n}"
但问题是我的正则表达式正在替换和排序引号内的字符,然后输出如下所示:
"if( Code == \" * This + is - string * \" )\n{\nint a = b * c;\n}"
如您所见,它排列在 CodeLine 字符串内的“字符串”内......
我正在为代码编辑器进行智能缩进。所以现在我正在尝试制作一个排列器,这将使代码看起来更好(就像在 VS 中它会在结束块或行 ";" 后自动插入空格和新行。
这是我的正则表达式:
public string Arrange_String( string String )
{
String = Regex.Replace( String , @"(\w)([\]\[!#$%&'()*+,./:;<=>?@\^_`{|}~-])" , @"$1 $2" );
String = Regex.Replace( String , @"([\]\[!#$%&'()*+,./:;<=>?@\^_`{|}~-])(\w)" , @"$1 $2" );
String = Regex.Replace( String , @"(\s*)(\.)" , @"$2" );
String = Regex.Replace( String , @"(\.)(\s*)" , @"$1" );
String = Regex.Replace( String , @"(\s*)(\()" , @"$2" );
String = Regex.Replace( String , @"(\))(\s*)" , @"$1" );
String = Regex.Replace( String , @"(\s*)(\[)" , @"$2" );
String = Regex.Replace( String , @"(\])(\s*)(\W)" , @"$1$3" );
String = Regex.Replace( String , @"(\s*)" + @"(""""|@""""|''|@"".*?""|(?<!@)(?<range>"".*?[^\\]"")|'.*?[^\\]')" + @"(\s*)" , @" $2 " );
return String;
}
编辑 :
一小时后,我找到了一种有效且简单的解决方案。首先这是我的代码:
public string Arrange_Code( string Main_String )
{
string Final_String = "";
string Accumulated_String = "";
bool Accumulate = true;
bool Igonre = false;
for ( int i = 0 ; i < Main_String.Length ; i++ )
{
if ( Main_String[i] == '\"' )
{
Igonre = false;
if ( i > 1 )
{
if ( Main_String[i - 1] == '\\' || Main_String[i - 1] == '\"' )
{
Igonre = true;
}
}
if ( Igonre == false )
{
if ( Accumulate == true )
{
Accumulate = false;
if ( Accumulated_String.Length != 0 )
{
Final_String += Arrange_String( Accumulated_String );
}
Accumulated_String = "";
}
else
{
Accumulate = true;
}
}
}
if ( Accumulate == true )
{
Accumulated_String += Main_String[i];
}
else
{
Final_String += Main_String[i];
}
}
return Final_String + Accumulated_String;
}
public string Arrange_String( string String )
{
String = Regex.Replace( String , @"(\w)([\]\[!#$%&'()*+,./:;<=>?@\^_`{|}~-])" , @"$1 $2" );
String = Regex.Replace( String , @"([\]\[!#$%&'()*+,./:;<=>?@\^_`{|}~-])(\w)" , @"$1 $2" );
String = Regex.Replace( String , @"(\s*)(\.)" , @"$2" );
String = Regex.Replace( String , @"(\.)(\s*)" , @"$1" );
String = Regex.Replace( String , @"(\s*)(\()" , @"$2" );
String = Regex.Replace( String , @"(\))(\s*)" , @"$1" );
String = Regex.Replace( String , @"(\s*)(\[)" , @"$2" );
String = Regex.Replace( String , @"(\])(\s*)(\W)" , @"$1$3" );
String = Regex.Replace( String , @"(\s*)" + @"(""""|@""""|''|@"".*?""|(?<!@)(?<range>"".*?[^\\]"")|'.*?[^\\]')" + @"(\s*)" , @" $2 " );
return String;
}
在使用正则表达式替换之前,我试图找到真正需要用“Arrange_Code”方法替换的字符串部分。