【问题标题】:Match content inside brackets [duplicate]匹配括号内的内容[重复]
【发布时间】:2018-01-18 14:35:59
【问题描述】:

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

"\(.*\)"

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

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

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

【问题讨论】:

  • 如果递归在正则表达式的 C# 实现中起作用 - \(((?R)|[^\(\)])+\)
  • 显示错误 - prntscr.com/i27syy

标签: c# regex


【解决方案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)

【讨论】:

    【解决方案2】:

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

    详情

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

    + 匹配一次到无限次

    |

    Regex demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多