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

如何用正则解析含嵌套泛型的.NET类型信息?

解决.NET嵌套泛型类型的正则解析问题

核心解法思路

要处理嵌套方括号的泛型参数拆分,关键是利用.NET正则支持的**平衡组(Balancing Groups)**来跟踪方括号的嵌套层级,确保能匹配到成对的方括号,从而完整提取每个泛型参数(包括嵌套的泛型类型)。

关键正则表达式

针对方括号内的泛型参数列表,使用以下正则匹配单个完整的参数:

(?>[^,\[\]]+|\[(?<Depth>)|\](?<-Depth>))+(?(Depth)(?!))

正则说明

  • (?>...):原子组,避免不必要的回溯,提升匹配效率
  • [^,\[\]]+:匹配非逗号、非方括号的普通类型文本
  • \[(?<Depth>):遇到左方括号时,将嵌套层级计数器Depth加1
  • \](?<-Depth>):遇到右方括号时,将嵌套层级计数器Depth减1
  • +(?(Depth)(?!)):重复匹配直到Depth归0(确保方括号完全成对),否则匹配失败

解析流程

  1. 先识别泛型类型前缀(如System.Tuple3[`),提取基础类型名和泛型参数数量
  2. 从方括号内的字符串中,用上述正则逐个提取完整的泛型参数文本
  3. 对每个提取到的参数文本递归调用解析方法,处理嵌套的泛型结构

C#代码实现示例

public class TypeInformation
{
    public string TypeName { get; set; }
    public List<TypeInformation> GenericArguments { get; set; } = new();
}

public static class TypeInformationParser
{
    // 匹配泛型类型前缀(格式:类型名`参数数[)
    private static readonly Regex GenericTypePrefixRegex = new(@"^(.+)`(\d+)\[", RegexOptions.Compiled);
    // 匹配完整的泛型参数(支持嵌套方括号)
    private static readonly Regex GenericArgumentRegex = new(@"(?>[^,\[\]]+|\[(?<Depth>)|\](?<-Depth>))+(?(Depth)(?!))", RegexOptions.Compiled);

    public static TypeInformation Parse(string typeString)
    {
        // 处理非泛型类型
        if (!typeString.Contains('['))
        {
            return new TypeInformation { TypeName = typeString.Trim(']') };
        }

        // 提取泛型前缀信息
        var prefixMatch = GenericTypePrefixRegex.Match(typeString);
        if (!prefixMatch.Success)
        {
            throw new ArgumentException("无效的泛型类型字符串格式");
        }

        var typeInfo = new TypeInformation
        {
            TypeName = prefixMatch.Groups[1].Value
        };

        // 截取方括号内的参数内容
        var argsContent = typeString.Substring(prefixMatch.Length, typeString.Length - prefixMatch.Length - 1);
        // 提取所有完整的泛型参数
        var argsMatches = GenericArgumentRegex.Matches(argsContent);
        foreach (Match match in argsMatches)
        {
            typeInfo.GenericArguments.Add(Parse(match.Value));
        }

        return typeInfo;
    }
}

测试效果

输入嵌套泛型字符串:System.Tuple3[System.String, System.Tuple2[System.Int32, System.Boolean], System.Double]
解析后得到的TypeInformation结构:

  • 外层TypeName为System.Tuple
  • 包含3个泛型参数:
    1. TypeName为System.String,无嵌套参数
    2. TypeName为System.Tuple,包含System.Int32和System.Boolean两个嵌套参数
    3. TypeName为System.Double,无嵌套参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:15:25