正则表达式,仅替换字符串中引号("")之外的字符

本文关键字:quot 字符 替换 字符串 正则表达式 | 更新日期: 2023-09-27 17:49:01

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

的例子:

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字符串中的"string"里面…

我正在为代码编辑器做一个智能缩进。所以现在我试图做一个安排,这将使代码看起来更好(像在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"方法替换的字符串部分。

正则表达式,仅替换字符串中引号("")之外的字符

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

问题在于,引号根据上下文可以用作开始标记、结束标记和字符。它在上下文中与转义字符一起使用,转义字符本身可以被转义。基本上,这与使用regex解析XML非常相似——只是不要这样做!