如何处理字符串.按位置划分

本文关键字:字符串 位置 划分 处理 何处理 | 更新日期: 2023-09-27 18:11:19

我想问一个关于String的问题。将

例如:

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

可以用括号分割str,然后用分号分割。最后,我在括号中得到了Firstpart和Sndpart。

但是如果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 }

你可以继续这样分割

是否有办法告诉c#分割第二个分号?

没有直接的方法可以做到这一点,但如果这正是你想要的,这并不难实现:

string str="AND[AND[Firstpart;Sndpart];sndpart];
string[] tSplits = str.Split(';', 3);
string[] splits = { tSplits[0] + ";" + tSplits[1], tSplits[2] };

你可以使用IndexOf()Substring()的组合来达到同样的结果,但是这很可能不是你最终会使用的,因为它太具体了,对各种输入不是很有帮助。

对于你的情况,你需要一些能理解上下文的东西。

在现实世界的复杂情况下,您可能会使用词法分析器/解析器,但在这里这似乎是多余的。

你最好的努力可能是使用一个循环,遍历所有字符,同时计算+/-方括号,并在发现分号&amp时进行分割;

您可以使用Regex.Split,这是String.Split的一种更灵活的形式:

string str = "AND[AND[Firstpart;Sndpart];sndpart]";
string[] arr = Regex.Split(str, @"(.*?;.*?;)");

foreach (var s in arr)
    Console.WriteLine("'{0}'", s);
// output: ''
//         'AND[AND[Firstpart;Sndpart];'
//         'sndpart]'

Regex.Split不是按字符分割,而是按匹配regex表达式的字符串分割,因此它归结为构建满足特定需求的regex模式。按第二个分号分割实际上是按以分号结尾且前面包含另一个分号的字符串分割,因此分割输入字符串的匹配模式可以为:(.*?;.*?;) .

返回的数组有三个元素而不是两个,因为分割正则表达式匹配输入字符串的开头,在这种情况下,空字符串作为第一个元素返回。

您可以在msdn上阅读更多关于Regex.Split的内容