在C#中解析嵌套文本

时间:2010-10-12 07:25:23

标签: c# parsing text-parsing

如果我有一系列具有此基本格式的字符串:

"[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()这样的东西还是有更好的方法?

4 个答案:

答案 0 :(得分:2)

一点点的递归和拆分都可行,主要的一点是使用递归,它会让它变得如此简单。您的输入语法看起来有点像LISP:)

Parsing a, split, no second part. done.
Parsing a [b value]. has second part, go to the beginning.
...

你明白了。

答案 1 :(得分:2)

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);
        }

答案 2 :(得分:1)

正则表达式总是一个很好的解决方案。

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;

答案 3 :(得分:0)

简单拆分应该有效 对于每个 id ,都有一个括号 [
因此,当您拆分该字符串时,您有 n-bracket 所以 n-1 id(s),其中最后一个元素包含该值。