匹配括号内的内容

时间:2018-01-18 14:36:00

标签: c# regex

我有一个很好的正则表达式,适用于我的大多数情况:

"\(.*\)"

此正则表达式匹配嵌套括号,这是好的:“ABC (DEF(GHI)JKL) MNO”

但是有一个棘手的案例:“这是ABC (XXX)DEF(XXX)(XXX)”。正如你所看到的,这个正则表达式也匹配DEF,但它没有。

关于如何调整我的正则表达式的任何想法?

2 个答案:

答案 0 :(得分:1)

如果不坚持正常表达式,您可以放置​​一个简单的基于堆栈的实现:

using System.Linq;

...

private static IEnumerable<string> EnumerateEnclosed(string value) {
  if (null == value)
    yield break;

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

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

    if (ch == '(')
      positions.Push(i);
    else if (ch == ')') 
      if (positions.Any()) {
        int from = positions.Pop();

        if (!positions.Any()) // <- outmost ")"
          yield return value.Substring(from, i - from + 1);
      }
  }
}

测试:

// Let's combine both examples into one and elaborate it a bit further:
string test = "ABC (DEF (GHI) J(RT(123)L)KL) MNO (XXX1) DEF (XXX2) (XXX3)";

Console.WriteLine(string.Join(Environment.NewLine, EnumerateEnclosed(test)));

结果:

(DEF (GHI) J(RT(123)L)KL)
(XXX1)
(XXX2)
(XXX3)

答案 1 :(得分:0)

正则表达式\([^)]+\)[^(]+\)|\([^)]+\)

<强>详情:

[^(]匹配列表中不存在的单个字符“(”

+在一次和无限次之间匹配

|

Regex demo