【问题标题】:Parsing Nested Text in C Sharp在 C Sharp 中解析嵌套文本
【发布时间】:2010-10-12 07:25:23
【问题描述】:

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

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

【问题讨论】:

  • id 或 value 可以包含 '[' 或 ']' 吗?
  • 您是在代码中创建此字符串还是来自其他地方?
  • [a value[b [c value][d value]]] 有效吗?
  • 同样在[a [b [c [value]]] 中,似乎最深的元素缺少一个 id。是语法的一部分还是那部分?

标签: c# parsing text-parsing


【解决方案1】:

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

【讨论】:

  • SplitIndexOf 存在用于(高级)字符串解析,因为猎枪存在用于射击自己的脚。 ;-) 但我实际上很喜欢你的代码,只要值不包含空格,它就应该可以工作(尽管它非常效率低下)。
【解决方案2】:

一点点递归和拆分就可以了,重点是使用递归,它会让它变得更容易。你的输入语法看起来有点像 LISP :)

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

你明白了。

【讨论】:

    【解决方案3】:

    正则表达式总是一个不错的解决方案。

    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;
    

    【讨论】:

    • 正则表达式并不总是一个好的解决方案。 “哦,我可以用正则表达式解决这个问题”——现在你有两个问题。
    • 那么,您的解决方案有什么问题(甚至是两个)?我觉得比任何拆分操作都清晰。
    • 您认为,但不会有其他开发人员会维护它。拆分也不好。
    • 如果嵌套的方式多于自上而下的嵌套方式,您将遇到麻烦。 stackoverflow.com/questions/1732348/…
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 2013-05-29
      • 1970-01-01
      • 2021-07-08
      相关资源
      最近更新 更多