关于vba:如何在忽略空格的情况下返回正则表达式的子匹配组?

How do you return a regex submatched group whilst ignoring spaces?

我在找一个regex的帮助。

我拥有的数据是由5个数字组成的组,用逗号分隔。所以,可能有这样的数据:

没有逗号的单个组:12345

任意数量的组:

1
2
12345,54321,56789,09876
12345,54321,56789

或者包含一些空格:

1
2
" 12345 , 54321 , 56789 , 09876"
"12345 , 54321 , 56789 , 09876"

但它们始终是数字,并且始终以逗号分隔。

我需要的是一个regex,它将为整个模式返回一个匹配项,而不是为每个分隔组返回一个组,但我想忽略空白。

使用此字符串:

1
" 12345 , 54321 , 56789 , 09876"

这种模式,我已经设法做到了:

1
^(\s*\d{5})(?:\s*,\s*(\d{5})\s*)*$

但这又回来了:

1
2
3
Full match     " 12345 , 54321 , 56789 , 09876"  
Group 1.       " 12345"  
Group 2.       "09876"

这里的问题是,空格仍然是完整的,组1匹配。还有中间两组失踪。

但是,它应该返回:

1
2
3
4
5
Full match     "12345,54321,56789,09876"    
Group 1.       "12345"  
Group 2.       "54321"  
Group 3.       "56789"  
Group 4.       "09876"

忽略所有空格和附加的两个组。

如果有人能协助Regex模式,我们将不胜感激。

最后,我要寻找一个与vba兼容的regex模式,因为它最终会在这里被使用。


vba regex不允许存储与重复捕获组匹配的所有捕获值。

可以使用现有的regex验证字符串(可以删除捕获组以使其更精简),然后在匹配时,通过用逗号拆分字符串来获取一个值数组,然后在数组上迭代以修剪所有空白并将值放入集合中。

下面是VBA中的一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Dim reg As RegExp
Dim ms As MatchCollection
Dim coll As Collection
Dim tmpArr As Variant

Dim s As String

s =" 12345 , 54321 , 56789 , 09876"
Set reg = New RegExp
Set coll = New Collection
With reg
  .Pattern ="^\s*\d{5}(?:\s*,\s*\d{5})*\s*$"
End With

Set ms = reg.Execute(s)     ' Search for a match
If ms.Count > 0 Then        ' There is match
  tmpArr = Split(s,",")    ' Split with comma
  For Each i In tmpArr      ' Iterate over the array
    coll.Add (Trim(i))      ' Trim each item
  Next i
End If

enter image description here