【问题标题】:separate nested parentheses in c#c#中的单独嵌套括号
【发布时间】:2016-07-20 10:47:06
【问题描述】:

我想在给定字符串中从括号内取值。所以,如果我的字符串中有括号,首先我必须到达最深的括号。之后,我必须在后面的括号中加上前一个字符串。我必须沿着字符串进行这些过程。

输入示例:

C1 AND [C2 OR C3 OR [C4 OR [C5 AND C6] AND C7]] OR C8

输出:

C5 AND C6
C4 OR [C5 AND C6] AND C7
C2 OR C3 OR [C4 OR [C5 AND C6] AND C7]
C1 AND [C2 OR C3 OR [C4 OR [C5 AND C6] AND C7]] OR C8

【问题讨论】:

  • 这不是用正则表达式来完成的,它需要一些算法,可能还有一个或多个堆栈:)
  • 我认为它可以很容易地用正则表达式制作,因为我不掌握正则表达式。我用拆分方法解决这个问题吗?

标签: c# regex split nested parentheses


【解决方案1】:

这是一个简单的stack实现; 正则表达式不适合这样的解析问题:

private static IEnumerable<String> Nested(string value) {
  if (string.IsNullOrEmpty(value))
    yield break; // or throw exception

  Stack<int> brackets = new Stack<int>();

  for (int i = 0; i < value.Length; ++i) {
    char ch = value[i];

    if (ch == '[')
      brackets.Push(i);
    else if (ch == ']') {
      //TODO: you may want to check if close ']' has corresponding open '['
      // i.e. stack has values: if (!brackets.Any()) throw ...
      int openBracket = brackets.Pop();

      yield return value.Substring(openBracket + 1, i - openBracket - 1);
    }
  }

  //TODO: you may want to check here if there're too many '['
  // i.e. stack still has values: if (brackets.Any()) throw ... 

  yield return value;
}

...

string source = "C1 AND [C2 OR C3 OR [C4 OR [C5 AND C6] AND C7]] OR C8";

var result = Nested(source);

打印出来:

// C5 AND C6
// C4 OR [C5 AND C6] AND C7
// C2 OR C3 OR [C4 OR [C5 AND C6] AND C7]
// C1 AND [C2 OR C3 OR [C4 OR [C5 AND C6] AND C7]] OR C8
Console.Write(String.Join(Environment.NewLine, result));

【讨论】:

  • 该代码解决了我的问题。非常感谢您的帮助。
猜你喜欢
  • 2019-08-11
  • 1970-01-01
  • 2022-06-12
  • 2020-06-19
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 2021-07-30
  • 2015-03-29
相关资源
最近更新 更多