用于提取子组中数据的正则表达式函数

Regex function to extract data in sub groups

提问人:Ranga 提问时间:5/8/2023 最后编辑:The fourth birdRanga 更新时间:5/9/2023 访问量:55

问:

我正在尝试将以下数据提取到 vb.net 中的主组和子组中

(abc())(def((123)(456))(klm((123))

赛果 预期
比赛1:abc
比赛2:def
第1组:123 第2组:456
比赛3:荷航
第1组:123

我已经尝试了以下代码,但它不起作用(\w+)\((\d+)\)

正则表达式 vb.net

评论


答:

2赞 Nick 5/8/2023 #1

您可以使用这个正则表达式,它匹配前面有 a 的字母,然后使用前瞻来捕获其中的一组或两组数字:(()

(?<=\()[a-z]+(?=\((?:\((\d+)\))?(?:\((\d+)\))?\))

regex101 上的演示

示例 VB.Net 代码:

Imports System
Imports System.Text.RegularExpressions

Public Class Test
    Public Shared Sub Main() 
        Dim i As Integer
        Dim pattern As String = "(?<=\()[a-z]+(?=\((?:\((\d+)\))?(?:\((\d+)\))?\))"
        Dim text As String = "(abc())(def((123)(456))(klm((123))"
        Dim matches As MatchCollection = System.Text.RegularExpressions.Regex.Matches(text, pattern)
        For Each m As Match In matches
            i = 0
            For Each g As Group in m.Groups
                If i = 0 Then
                    Console.WriteLine("Match: " & g.Value)
                ElseIf i > 0 and g.Value <> "" Then
                    Console.WriteLine("Group " & i & ": " & g.Value)
                End If
                i = i + 1
            Next
        Next
    End Sub
End Class

输出:

Match: abc
Match: def
Group 1: 123
Group 2: 456
Match: klm
Group 1: 123

ideone.com 上的演示

2赞 Wiktor Stribiżew 5/8/2023 #2

您似乎想匹配一个“单词”,后跟括号内带括号的数字。这里的通用方法可以满足单词后括号内 s 数量未知的情况。(num)

你可以使用

(\w+)\((?:\((\d+)\))*\)

并依赖于可在 .NET 正则表达式 API 中访问的 Match.Captures 属性。以下是访问所有组和捕获值的方法:

Imports System
Imports System.Text.RegularExpressions

Public Class Test
    Public Shared Sub Main() 
        Dim pattern As String = "(\w+)\((?:\((\d+)\))*\)"
        Dim text As String = "(abc())(def((123)(456))(klm((123))"
        Dim matches As MatchCollection = System.Text.RegularExpressions.Regex.Matches(text, pattern)
        For Each m As Match In matches
            Console.WriteLine("Match: " & m.Groups(1).Value)
            For Each g As Capture in m.Groups(2).Captures
                Console.WriteLine("Capture: " & g.Value)
            Next
        Next
        
    End Sub
End Class

请参阅此 VB.NET 演示正则表达式演示。输出:

Match: abc
Match: def
Capture: 123
Capture: 456
Match: klm
Capture: 123

正则表达式匹配(\w+)\((?:\((\d+)\))*\)

  • (\w+)- 第 1 组:一个或多个单词字符
  • \(- 一个字符(
  • (?:\((\d+)\))*- 零次或多次重复
    • \(- 一个字符(
    • (\d+)- 第 2 组:一个或多个数字
    • \)- 一个字符)
  • \)- 一个字符)