如何防止正则表达式中的某些字符匹配?

时间:2019-07-01 21:40:22

标签: regex vba

我需要有关正则表达式的帮助,以防止将'-'和','以外的字符与数字一起识别。

我有一个数据流,该数据流由数字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。 谢谢

2 个答案:

答案 0 :(得分:2)

您可以使用

(?:^|,)([1-9]\d*(?:-[1-9]\d*)?)(?=,|$)
^^^^^^^

请参见regex demoregex graph

enter image description here

要点是与字符串开头((?:^|,)或(^)逗号匹配的|组。请注意,我从+中删除了[1-9],以减少回溯。

详细信息

  • (?:^|,)-字符串或,
  • 的开头
  • ([1-9]\d*(?:-[1-9]\d*)?)-捕获组1(通过 match.Submatches(0) 访问):
    • [1-9]\d*-从19的数字,然后是0+的数字
    • (?:-[1-9]\d*)?--的可选序列,从19的数字,然后是任意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

输出:

enter image description here

答案 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个字符添加可选的组。

DEMO