VB.NET中如何用正则函数提取字符串的主组与子组数据
VB.NET提取嵌套括号中的主组与子组解决方案
你的问题核心是原正则无法处理多层嵌套括号的结构,以下是具体解决步骤:
问题分析
原正则(\w+)\((\d+)\)仅能匹配"单词+(数字)"的直接结构,但目标字符串中主组(如abc/def)与数字子组之间存在多层嵌套括号,因此需要先分离主组及其对应的括号区域,再从中提取数字子组。
解决方案1:非贪婪匹配快速实现
先匹配每个主组及其关联的内部内容,再从内容中提取所有数字子组:
VB.NET代码示例
Dim input As String = "(abc())(def((123)(456))(klm((123))" ' 匹配主组及其内部内容:(主组(内部内容) Dim mainRegex As New Regex("\((\w+)\((.*?)(?=\)(?:\(|$))", RegexOptions.Singleline) Dim matchCount As Integer = 1 For Each mainMatch As Match In mainRegex.Matches(input) Dim mainGroupVal As String = mainMatch.Groups(1).Value Console.WriteLine($"Match {matchCount} : {mainGroupVal}") ' 从内部内容中提取所有数字子组 Dim subRegex As New Regex("\d+") Dim subMatchCount As Integer = 1 For Each subMatch As Match In subRegex.Matches(mainMatch.Groups(2).Value) Console.WriteLine($"子组{subMatchCount}:{subMatch.Value}") subMatchCount += 1 Next matchCount += 1 Next
解决方案2:平衡组精准处理嵌套括号
如果需要更严谨地处理嵌套括号(避免非贪婪匹配可能的边界错误),可以使用.NET正则支持的平衡组来匹配括号平衡的内容:
VB.NET代码示例
Dim input As String = "(abc())(def((123)(456))(klm((123))" ' 平衡组正则:匹配主组及括号平衡的内部内容 Dim mainRegex As New Regex("\((\w+)\((?>[^()]+|\((?<depth>)|\)(?<-depth>))*(?(depth)(?!))", RegexOptions.Singleline) Dim matchCount As Integer = 1 For Each mainMatch As Match In mainRegex.Matches(input) Dim mainGroupVal As String = mainMatch.Groups(1).Value Console.WriteLine($"Match {matchCount} : {mainGroupVal}") ' 提取所有数字子组 Dim subRegex As New Regex("\d+") Dim subMatchCount As Integer = 1 For Each subMatch As Match In subRegex.Matches(mainMatch.Value) Console.WriteLine($"子组{subMatchCount}:{subMatch.Value}") subMatchCount += 1 Next matchCount += 1 Next
平衡组正则说明
(?<depth>):遇到左括号时,增加深度计数器(?<-depth>):遇到右括号时,减少深度计数器(?(depth)(?!)):如果深度计数器不为0,则匹配失败,确保括号完全平衡
内容的提问来源于stack exchange,提问作者Ranga
相关产品推荐
相关产品推荐

