提问人:Ranga 提问时间:5/8/2023 最后编辑:The fourth birdRanga 更新时间:5/9/2023 访问量:55
用于提取子组中数据的正则表达式函数
Regex function to extract data in sub groups
问:
我正在尝试将以下数据提取到 vb.net 中的主组和子组中
(abc())(def((123)(456))(klm((123))
赛果 预期
比赛1:abc
比赛2:def
第1组:123 第2组:456
比赛3:荷航
第1组:123
我已经尝试了以下代码,但它不起作用(\w+)\((\d+)\)
答:
2赞
Nick
5/8/2023
#1
您可以使用这个正则表达式,它匹配前面有 a 的字母,然后使用前瞻来捕获其中的一组或两组数字:(
()
(?<=\()[a-z]+(?=\((?:\((\d+)\))?(?:\((\d+)\))?\))
示例 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
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 组:一个或多个数字\)
- 一个字符)
\)
- 一个字符)
评论