如何用C#正则检查嵌套括号深度及实现嵌套frac结构分组捕获?
C#正则表达式相关问题解答
问题1:如何使用C#正则表达式检查嵌套括号的深度?
可以借助C#正则支持的平衡组跟踪括号的开闭状态,配合代码计算最大嵌套深度:
- 用
(?<open>\{)匹配左括号时,相当于将标记入栈;用(?<-open>\})匹配右括号时,将标记出栈; - 遍历匹配过程,实时记录当前的嵌套深度,同步更新最大深度值。
示例代码:
string input = "frac{frac{1}{2}}{frac{3}{frac{4}{frac{5}{6}}}}"; Regex regex = new Regex(@"(?<open>\{)|(?<-open>\})|[^{}]+"); int maxDepth = 0; int currentDepth = 0; foreach (Match match in regex.Matches(input)) { if (match.Groups["open"].Success) { currentDepth++; maxDepth = Math.Max(maxDepth, currentDepth); } else if (currentDepth > 0) { currentDepth--; } } Console.WriteLine($"最大嵌套深度:{maxDepth}"); // 输出:4
问题2:能否通过正则表达式实现按深度捕获指定分组?
无法直接通过正则表达式实现。原因如下:
- C#正则的捕获组是静态定义的,无法根据嵌套层级动态生成新的捕获组(比如需求中的group2.1、group3这类随深度变化的分组);
- 平衡组只能匹配完整的嵌套结构,但不能自动将多层嵌套的内容拆分为独立的捕获组。
要实现按深度提取各层级的frac{...}{...}结构,更可行的方式是迭代/递归提取:
- 用平衡组正则匹配最外层的
frac结构; - 对匹配得到的分子、分母部分,重复执行匹配逻辑,逐层提取内层的
frac内容。
示例代码:
string input = "frac{frac{1}{2}}{frac{3}{frac{4}{frac{5}{6}}}}"; Regex fracRegex = new Regex(@"frac\{((?:[^{}]|(?<open>\{)|(?<-open>\}))*)\}\{((?:[^{}]|(?<open>\{)|(?<-open>\}))*)\}(?(open)(?!))"); List<string> extractedFracs = new List<string>(); Queue<string> processQueue = new Queue<string>(); processQueue.Enqueue(input); while (processQueue.Count > 0) { string currentContent = processQueue.Dequeue(); Match match = fracRegex.Match(currentContent); if (match.Success) { extractedFracs.Add(currentContent); // 处理分子部分 string numerator = match.Groups[1].Value; if (numerator.StartsWith("frac{")) { processQueue.Enqueue($"frac{{{numerator}}}"); } // 处理分母部分 string denominator = match.Groups[2].Value; if (denominator.StartsWith("frac{")) { processQueue.Enqueue($"frac{{{denominator}}}"); } } } // 输出结果依次为:完整文本、frac{1}{2}、frac{3}{frac{4}{frac{5}{6}}}、frac{4}{frac{5}{6}}、frac{5}{6} foreach (var item in extractedFracs) { Console.WriteLine(item); }
内容的提问来源于stack exchange,提问作者user10423802
相关产品推荐
相关产品推荐

