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

时间:2018-07-08 16:44:54

标签: regex vba

我正在寻找有关正则表达式的帮助。

我的数据是由5个数字组成的组,并用逗号分隔。因此,可能会有这样的数据:

没有逗号的单个组:12345

任何组数:

12345,54321,56789,09876
12345,54321,56789

或包含一些空格:

" 12345 , 54321 , 56789 , 09876 "
"12345 , 54321 , 56789 , 09876"

但是它们将始终是数字并且始终用逗号分隔。

我需要的是一个正则表达式,它将为整个模式返回一个匹配项,而不是为每个定界的组返回一个匹配项,但是我想忽略空格。

使用此字符串:

" 12345 , 54321 , 56789 , 09876 "

和这种模式,我设法做到了这一点:

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

但这返回:

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

这里的问题是空格仍在完整匹配和第1组匹配中。也缺少中间的两个小组。

但是应该返回以下内容:

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

所有空格均被忽略,另外两个组被忽略。

如果有人可以协助使用正则表达式模式,将不胜感激。

最终,我正在寻找一种与VBA兼容的正则表达式模式,因为它最终将在这里使用。

1 个答案:

答案 0 :(得分:1)

VBA正则表达式不允许存储与repeated capturing group匹配的所有捕获值。

您可以使用自己的正则表达式验证字符串(可以删除捕获组以使其更精简),然后在匹配时,通过用逗号分割字符串然后遍历该数组以得到一个值数组。修剪所有空白并将值放入集合中。

以下是VBA中的一个示例:

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