c# - 带平衡组的正则表达式不仅匹配最外面的匹配项

标签 c# .net regex

我已经阅读了多个有关如何使用平衡组的资料,但所有示例仅匹配最外层的匹配项。是否可以用一个正则表达式来匹配与该模式匹配的所有子字符串? (平台为.NET 4.0)

这是我想要的示例: 输入:

a + ((b + (c + d)) + (e + f))

所需的匹配(“教科书”正则表达式仅生成第一个匹配):

  • ((b + (c + d)) + (e + f))
  • (b + (c + d))
  • (c + d)
  • (e + f)

最佳答案

这可以通过正则表达式在前瞻的帮助下完成。但这并不是最佳选择,因为它会为每场比赛“重新解析”一些括号组。使用真正的解析器只会读取/解析字符串一次,并且效率更高。

示例(ideone):

using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      var re = @"(?x)  # ignore spaces and comments
(?=                    # lookahead (zero width)
  (
    \(                 # first (
    (?:
      (?<open> \( )*   # open++
      [^()]+
      (?<-open> \) )*  # open--
    )+
    \)                 # last )
    (?(open)(?!))      # fail if unblanaced: open > 0
  )
)
\(                     # eat a (, to advance the match a char";

      var str = "a + ((b + (c + d)) + (e + f)) + (x + ((y) + (z)) + x)";

      var m = Regex.Matches(str, re);

      Console.WriteLine("Matched: ");
      foreach (Match i in m)
        Console.WriteLine(i.Groups[1]);
   }
}

输出:

Matched: 
((b + (c + d)) + (e + f))
(b + (c + d))
(c + d)
(e + f)
(x + ((y) + (z)) + x)
((y) + (z))
(y)
(z)

关于c# - 带平衡组的正则表达式不仅匹配最外面的匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15752778/

相关文章:

c# - 使用并行程序集加载 x64 或 x32 版本的 DLL

c# - 正则表达式检查验证字符串是否有 0 个或多个数值和其他项目

c# - 为递归方法生成 IL

c# - 正则表达式给出编译器错误

php - 正则表达式检查字符串是否有不匹配的括号?

regex - gsub 返回\n(换行符)

c# - c# 中的链表和红/黑树 - 引用问题?

asp.net - 在屏幕键盘上调出大写的文本输入

c# - 使用 System.Text.Json 反序列化形状奇怪的数据

c# - 检查类/接口(interface)继承的正确方法是什么?