如果我有一系列具有这种基本格式的字符串:
"[id value]"//id and value are space delimited. id will never have spaces
然后可以像这样嵌套它们:
[a]
[a [b value]]
[a [b [c [value]]]
因此每个项目可以有0或1个值条目。
解析此格式的最佳方法是什么?我是否只使用string.Split()或string.IndexOf()之类的东西,还是有更好的方法?
split和indexof方法没有问题,它们存在于字符串解析中。这是您的案例示例:
string str = "[a [b [c [d value]]]]";
while (str.Trim().Length > 0)
{
int start = str.LastIndexOf('[');
int end = str.IndexOf(']');
string s = str.Substring(start +1, end - (start+1)).Trim();
string[] pair = s.Split(' ');// this is what you are looking for. its length will be 2 if it has a value
str = str.Remove(start, (end + 1)- start);
}
进行一点递归和拆分会起作用,要点是使用递归,它将使它变得更加容易。您的输入语法看起来像LISP:)
Parsing a, split, no second part. done.
Parsing a [b value]. has second part, go to the beginning.
...
您明白了。
Regex始终是一个不错的解决方案。
string test = "[a [b [c [value]]]";
Regex r = new Regex("\\[(?<id>[A-Za-z]*) (?<value>.*)\\]");
var res = r.Match(test);
然后您可以获取该值(在第一次迭代后为[b [c [value]]],然后再次应用该值,直到匹配失败。
string id = res.Groups[1].Value;
string value = res.Groups[2].Value;
简单拆分应该可以对于每个id,都有一个括号[因此,当您分割该字符串时,您将具有n-brackets和n-1 id,其中最后一个元素包含该值。