如何用C#正则表达式提取LaTeX中的完整嵌套分数?
修正C#正则提取LaTeX嵌套分数的方案
原正则无法处理嵌套的{}结构,导致匹配不完整。要提取完整的嵌套分数,需要使用平衡组正则来跟踪括号的开闭状态,确保匹配到与起始frac{对应的闭合}。
修正后的代码
string inputText = "frac{frac{1/2}}frac{frac{255/7890}/2}frac{frac{frac{ZZ/99}/66}/33}frac{frac{66/77}/frac{88/99}}"; // 使用平衡组匹配嵌套括号的完整分数 string pattern = @"frac{(?:[^{}]+|(?<open>{)|(?<-open>}))*(?(open)(?!))}"; var matches = Regex.Matches(inputText, pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled) .Cast<Match>() .OrderBy(s => s.Index); // 输出结果 Console.WriteLine($"Count: {matches.Count}"); foreach (var match in matches) { Console.WriteLine(match.Value); }
运行结果
Count: 4 frac{frac{1/2}} frac{frac{255/7890}/2} frac{frac{frac{ZZ/99}/66}/33} frac{frac{66/77}/frac{88/99}}
正则说明
frac{:匹配LaTeX分数的起始标识(?:[^{}]+|(?<open>{)|(?<-open>}))*:非捕获组,处理三种内容:[^{}]+:匹配非括号的普通文本(?<open>{):遇到左括号时,在open栈中添加一条记录(?<-open>}):遇到右括号时,从open栈中移除一条记录
(?(open)(?!)):条件断言,确保open栈为空(所有左括号都已闭合),否则匹配失败
内容的提问来源于stack exchange,提问作者user10423802
相关产品推荐
相关产品推荐

