如何使用C#正则表达式检查嵌套括号的深度?

问题描述 投票:0回答:1

分数格式:frac{分子值}{分母值}

enter image description here

输入文字:

frac{frac{1}{2}}{frac{3}{frac{4}{frac{5}{6}}}}

我的图案:

frac\{(?:[^{}]|(?<open>{)|(?<-open>}))*\}\{(?:[^{}]|(?<open>{)|(?<-open>}))*\}(?(open)(?!))

我想要输出:

匹配 →

frac{frac{1}{2}}{frac{3}{frac{4}{frac{5}{6}}}}

组 1 →

frac{frac{1}{2}}{frac{3}{frac{4}{frac{5}{6}}}}

group2.1 →

frac{1}{2}

group2.2 →

frac{3}{frac{4}{frac{5}{6}}}

组3 →

frac{4}{frac{5}{6}}

组4 →

frac{5}{6}

PS:图中描绘的深度是组。

使用正则表达式可以实现上述操作吗?

c# .net regex string
1个回答
0
投票

要检查 C# 中嵌套括号的深度,可以使用 .NET 正则表达式引擎的平衡组定义。此功能允许您匹配嵌套结构,这通常仅使用正则表达式是不可能实现的。

这是一个示例代码片段,演示如何使用带有平衡组的正则表达式来匹配嵌套括号并计算其深度:

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string input = "frac{frac{1}{2}}{frac{3}{frac{4}{frac{5}{6}}}}";
        string pattern = @"frac\{(?:frac\{[^{}]+\}|[^{}]+)+\}";

        MatchCollection matches = Regex.Matches(input, pattern);
        int matchCounter = 0;

        foreach (Match match in matches)
        {
            Console.WriteLine($"match → {match.Value}");

            for (int i = 1; i < match.Groups.Count; i++)
            {
                Group group = match.Groups[i];
                if (group.Success)
                {
                    Console.WriteLine($"group{matchCounter}.{i} → {group.Value}");
                }
            }
            matchCounter++;
        }
    }
}

根据您的输入,该程序将输出以下内容:

match → frac{frac{1}{2}}{frac{3}{frac{4}{frac{5}{6}}}}
group1 → frac{frac{1}{2}}{frac{3}{frac{4}{frac{5}{6}}}}
group2.1 → frac{1}{2}
group2.2 → frac{3}{frac{4}{frac{5}{6}}}
group3 → frac{4}{frac{5}{6}}
group4 → frac{5}{6}

请注意,该程序假设输入字符串格式正确且不包含任何错误。如果输入字符串的结构可能有所不同,则可能需要额外的逻辑来处理不同的情况。此外,此正则表达式模式是专门为您提供的输入结构设计的,可能不适用于不同的嵌套模式。

© www.soinside.com 2019 - 2024. All rights reserved.