首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按位置处理string.split

问如何按位置处理string.split
EN

Stack Overflow用户
提问于 2015-09-06 10:01:01
回答 3查看 1.2K关注 0票数 2

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

例如:

代码语言:javascript
复制
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#被第二个分号分开吗?

谢谢你的帮忙

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-06 14:37:25

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

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

如果你想这样做很多次的话,这种方法可能会有些过火。但是如果你有这个想法的话,你应该可以很容易地优化它。

代码语言:javascript
复制
    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;
    }

一些例子:

代码语言:javascript
复制
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 }

你可以继续这样分裂。

票数 1
EN

Stack Overflow用户

发布于 2015-09-06 11:14:23

有什么方法可以让c#被第二个分号分开吗?

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

代码语言:javascript
复制
string str="AND[AND[Firstpart;Sndpart];sndpart];
string[] tSplits = str.Split(';', 3);
string[] splits = { tSplits[0] + ";" + tSplits[1], tSplits[2] };

使用IndexOf()和Substring()组合可以获得相同的结果,但是这很可能不是您最终使用的结果,因为它太具体,对各种输入也没有太大的帮助。

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

在真实的复杂情况下,您可能会使用词法/解析器,但在这里这似乎有点过分。

您最大的努力可能是使用一个循环,在计数+/-方括号时遍历所有字符,并在找到分号时分叉&计数为1。

票数 0
EN

Stack Overflow用户

发布于 2015-09-06 18:16:21

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

代码语言:javascript
复制
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模式。第二个分号的拆分实际上是由一个以分号结尾的字符串进行拆分,该字符串之前包含另一个分号,因此您拆分输入字符串的匹配模式可以是:(.*?;.*?;)。

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

您可以在Regex.Split上msdn上阅读更多内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32422288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档