You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中使用REGEX提取嵌套括号内指定内容的问题

解决嵌套括号的正则匹配问题

嘿,我来帮你搞定这个正则问题~你遇到的问题很典型:原来的\(([^)]*)\)正则只能处理单层括号,因为[^)]*会匹配到第一个遇到的右括号就停止,碰到嵌套的括号(比如this()在mine(...)里面)就会提前终止,自然拿不到你想要的this()。

下面分两种情况给你解决方案:

情况1:精准提取this()

如果你的目标就是提取固定的this()子串,不管它嵌套在哪层括号里,那直接用最简单的正则匹配即可,完全不用处理嵌套逻辑:

string result = Regex.Match(a, @"this\(\)").Value;

这个正则会直接定位到字符串里的this(),一步到位。

情况2:通用处理嵌套括号(适配任意括号嵌套场景)

如果你的需求更通用——比如要匹配任意嵌套的括号对(比如提取this2(),或者提取mine(...)里的完整内容),那可以利用.NET正则支持递归匹配的特性,用递归表达式来处理:

提取最外层括号的完整内容

比如从mine(hello, this())里提取hello, this(),可以用这个正则:

// 匹配完整的括号对,包括内部嵌套
Match match = Regex.Match(a, @"\((?>[^()]+|(?<open>\()|(?<-open>\)))*(?(open)(?!))\)");
string fullContent = match.Groups[0].Value; // 结果是(hello, this()),如果要去掉外层括号可以取Groups[0].Value.Trim('(', ')')

提取任意嵌套的函数式括号(比如this()、this2())

如果要提取所有类似xxx(...)的嵌套结构,可以用:

MatchCollection matches = Regex.Matches(a, @"(\w+)\((?>[^()]+|(?<open>\()|(?<-open>\)))*(?(open)(?!))\)");
foreach (Match m in matches)
{
    Console.WriteLine(m.Value); // 会输出this()、this2()这类匹配项
}

递归正则的简单原理

上面用到的递归片段(?>[^()]+|(?<open>\()|(?<-open>\)))*(?(open)(?!))逻辑是:

  • [^()]+:先匹配非括号的普通字符
  • (?<open>\():遇到左括号时,在正则的栈里标记一个"open"
  • (?<-open>\)):遇到右括号时,从栈里移除一个"open"标记
  • *(?(open)(?!)):重复这个过程,直到栈里没有未匹配的"open"标记(也就是括号完全成对),确保不会提前终止匹配。

内容的提问来源于stack exchange,提问作者Logan Risen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:31:17