我想问一个关于String.Split的问题

例如:

char[] semicolon=new [] {';'};
char[] bracket=new [] {'[',']'};
string str="AND[Firstpart;Sndpart]";


我可以用括号将str分开,然后用分号分开。
最后,在括号中得到了第一部分和第二部分。

但是如果str="AND[AND[Firstpart;Sndpart];sndpart];
如何获得AND[Firpart;Sndpart]sndpart

有没有办法告诉C#用第二个分号分隔?

谢谢你的帮助

最佳答案

一种方法是将括号内的字符隐藏在任何字符串中都不使用的字符中。

方法HideSplit:此方法将用假冒号将方括号内的分隔符更改为。然后它将执行拆分,并使用原始字符返回结果。

如果您想多次执行此方法,则可能是一个过大的杀伤力。但是如果您有主意,则应该能够轻松对其进行优化。

    private static void Main()
    {
        char[] semicolon = new[] { ';' };
        char[] bracket = new[] { '[', ']' };
        string str = "AND[AND[Firstpart;Sndpart];sndpart]";

        string[] splitbyBracket = HideSplit(str, bracket);
    }

    private static string[] HideSplit(string str,char[] separator)
    {
        int counter = 0; // When counter is more than 0 it means we are inside brackets
        StringBuilder result = new StringBuilder(); // To build up string as result

        foreach (char ch in str)
        {
            if(ch == ']') counter--;

            if (counter > 0) // if we are inside brackets perform hide
            {
                if (ch == '[') result.Append('\uFFF0'); // add '\uFFF0' instead of '['
                else if (ch == ']') result.Append('\uFFF1');
                else if (ch == ';') result.Append('\uFFF2');
                else result.Append(ch);
            }
            else result.Append(ch);

            if (ch == '[') counter++;
        }


        string[] split = result.ToString().Split(separator); // Perform split. (characters are hidden now)

        return split.Select(x => x
            .Replace('\uFFF0', '[')
            .Replace('\uFFF1', ']')
            .Replace('\uFFF2', ';')).ToArray(); // unhide characters and give back result.
                                               // dont forget: using System.Linq;
    }


一些例子 :

string[] a1 = HideSplit("AND[AND[Firstpart;Sndpart];sndpart]", bracket);
// Will give you this array { AND , AND[Firstpart;Sndpart];sndpart }

string[] a2 = HideSplit("AND[Firstpart;Sndpart];sndpart", semicolon);
// Will give you this array { AND[Firstpart;Sndpart] , sndpart }

string[] a3 = HideSplit("AND[Firstpart;Sndpart]", bracket);
// Will give you this array { AND , Firstpart;Sndpart }

string[] a4 = HideSplit("Firstpart;Sndpart", semicolon);
// Will give you this array { Firstpart , Sndpart }


您可以继续以这种方式拆分。

10-06 13:45