我正在寻找有关正则表达式的帮助。
我的数据是由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兼容的正则表达式模式,因为它最终将在这里使用。
答案 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