正则表达式,替换为仅在字符串之外的引号(“”)

时间:2012-12-21 08:33:09

标签: c# regex string replace

我很难找到一个合适的模式,它只能替换字符串本身内部引号外的字符,

示例:

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;
    }

在使用Regex替换之前,我试图通过“Arrange_Code”方法找到真正需要替换的字符串部分。

1 个答案:

答案 0 :(得分:0)

您尝试编译的搜索不常规,因此不应该应用正则表达式。为这样的东西写一个解析器。

问题在于引号用作开始标记,结束标记以及取决于其上下文的字符。它在上下文中用于转义字符,它本身可以转义。基本上它非常像用正则表达式解析XML - 只是不要这样做!