1

文字列自体の内側の引用符の外側にある文字のみを置き換える適切なパターンを見つけるのは難しすぎます。

例 :

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

編集 :

1時間後、そのための効果的で簡単な解決策が1つ見つかりました。まずここに私のコードがあります:

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 replace を使用する前に、「Arrange_Code」メソッドで置換が本当に必要な文字列の部分を見つけようとしています。

4

1 に答える 1

0

コンパイルしようとしている検索は正規ではないため、正規表現を適用しないでください。このようなもののパーサーを書きます。

問題は、引用符が開始タグ、終了タグ、およびそのコンテキストに応じた文字として機能することです。また、それ自体をエスケープできるエスケープ文字とのコンテキストで使用されます。基本的に、正規表現を使用して XML を解析するのと非常によく似ています。

于 2012-12-21T11:48:05.260 に答える