获得以下结果的最佳方法是什么?
输入字符串: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()));
}
答案 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."
)比状态机更慢,没有更简单或更容易编写。