我需要有关正则表达式的帮助,以防止将'-'和','以外的字符与数字一起识别。
我有一个数据流,该数据流由数字0到9组成,这些数字用逗号定界,但永远不能以0开头(可以包含10但不能包含01)。这些定界数据包中的某些可以被连字。一组数字的示例如下:
12-34,56,78-90,12,34-45,67-8,90
我需要为每个以逗号分隔的部分提供正则表达式返回组,即:
Group 1: 12-34
Group 2: 56
Group 3: 78-90
Group 4: 12
Group 5: 34-45
Group 6: 67-8
Group 7: 90
到目前为止,我有这种模式:
[1-9]+\d*(?:-[1-9]+\d*)?(?=,|$)
问题在于,如果数字包含数字以外的虚假字符“-”或“,”,则表示该组被部分识别:
12£34,56,78-90,12,34-45,67-8,90
第1组:34
我该如何解决?我为此使用vba。 谢谢
答案 0 :(得分:2)
您可以使用
(?:^|,)([1-9]\d*(?:-[1-9]\d*)?)(?=,|$)
^^^^^^^
要点是与字符串开头((?:^|,)
或(^
)逗号匹配的|
组。请注意,我从+
中删除了[1-9]
,以减少回溯。
详细信息
(?:^|,)
-字符串或,
([1-9]\d*(?:-[1-9]\d*)?)
-捕获组1(通过 match.Submatches(0)
访问):
[1-9]\d*
-从1
到9
的数字,然后是0+的数字(?:-[1-9]\d*)?
--
的可选序列,从1
到9
的数字,然后是任意0+数字(?=,|$)
-逗号或字符串结尾。VBA测试:
Sub Test()
Dim val As String, rx As New regExp
Dim ms As MatchCollection, m As Match
val = "12L34,56,78-90,12,34-45,67-8,90"
Set rx = New regExp
rx.Pattern = "(?:^|,)([1-9]\d*(?:-[1-9]\d*)?)(?=,|$)"
rx.Global = True
Set ms = rx.Execute(val)
If ms.Count() > 0 Then
For Each m In ms
Debug.Print m.SubMatches(0)
Next
End If
End Sub
输出:
答案 1 :(得分:0)
我的猜测是,您可能只是在寻找一个简单的表达式,例如
^(\d+-\d+|(?:\d+\D)\d+),(\d+),(\d+-\d+|(?:\d+\D)\d+),(\d+),(\d+-\d+|(?:\d+\D)\d+),(\d+-\d+|(?:\d+\D)\d+),(\d+)$
为满足您从1到7的分组要求,您可以为字符串中可能存在的\D
个字符添加可选的组。