如何用正则解析含嵌套泛型的.NET类型信息?
解决.NET嵌套泛型类型的正则解析问题
核心解法思路
要处理嵌套方括号的泛型参数拆分,关键是利用.NET正则支持的**平衡组(Balancing Groups)**来跟踪方括号的嵌套层级,确保能匹配到成对的方括号,从而完整提取每个泛型参数(包括嵌套的泛型类型)。
关键正则表达式
针对方括号内的泛型参数列表,使用以下正则匹配单个完整的参数:
(?>[^,\[\]]+|\[(?<Depth>)|\](?<-Depth>))+(?(Depth)(?!))
正则说明
(?>...):原子组,避免不必要的回溯,提升匹配效率[^,\[\]]+:匹配非逗号、非方括号的普通类型文本\[(?<Depth>):遇到左方括号时,将嵌套层级计数器Depth加1\](?<-Depth>):遇到右方括号时,将嵌套层级计数器Depth减1+(?(Depth)(?!)):重复匹配直到Depth归0(确保方括号完全成对),否则匹配失败
解析流程
- 先识别泛型类型前缀(如
System.Tuple3[`),提取基础类型名和泛型参数数量 - 从方括号内的字符串中,用上述正则逐个提取完整的泛型参数文本
- 对每个提取到的参数文本递归调用解析方法,处理嵌套的泛型结构
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个泛型参数:
TypeName为System.String,无嵌套参数TypeName为System.Tuple,包含System.Int32和System.Boolean两个嵌套参数TypeName为System.Double,无嵌套参数
内容的提问来源于stack exchange,提问作者ScottishTapWater
相关产品推荐
相关产品推荐

