通过正则表达式将字符串转换为字符串数组

时间:2018-03-08 17:23:06

标签: c#

获得以下结果的最佳方法是什么?

输入字符串:this is a {test} for {performance}.

输出字符串[]:["this is a ", "{test}", " for ", "{performance}", "."]

这是我到目前为止所做的:

private void StringToArray(string text)
    {
        var firstSplit = text.Split('{');
        var list = new List<string>();
        foreach(var s in firstSplit)
        {
            if (s.Contains("}"))
            {
                var secondSplit = s.Split('}');
                list.Add("{" + secondSplit[0] + "}");
                if(secondSplit.Count() > 1)
                {
                    list.Add(secondSplit[1]);
                }
            }
            else
            {
                list.Add(s);
            }
        }
        Console.WriteLine(string.Join(",", list.ToArray()));
    }

1 个答案:

答案 0 :(得分:2)

如果你想获得所有的计算机科学知识,你可以建立一个状态机,一次一个字符地走一个字符串,使用堆栈跟踪下一个字符串部分的起始位置。当您找到JwtSecurityTokenHandler{字符时,会弹出先前的堆栈值并使用它来创建可添加到阵列的子字符串。然后将当前索引压入堆栈。

根据你想要处理嵌套的程度(即:“}”),转义字符(即:This is { a {test}.}{{),不平衡,这可能或多或少复杂字符串(即:\{),括号内的空格(即:This {is} a {Test)或排除引用字符串之类的内容(即:“This {is some} text”)但是逐个字符的状态机将成为表现最佳的选择。

在更高级别,您可以查看特定于域的语言,或使用lexxer / parser工具。不幸的是,中间几乎没有。 RegEx可以工作,但它通常很糟糕,因为你的输入不能说是正式的“常规”。在字边界上拆分很容易出错。基本的字符串操作(即:This is the text, "A {person} lived there.")比状态机更慢,没有更简单或更容易编写。