首页 > 解决方案 > VBA 正则表达式重复组仅第一次出现

问题描述

我有以下子字符串

var fixedDays =['20180101:V','20180102:V','20180106:W','20180107:W','20180113:W','20180114:W','20180120:W','20180121:W','20180124:V','20180127:W','20180128:W','20180203:W'

这是我正在执行正则表达式的更大字符串(big_string)的一部分。我正在尝试从此子字符串中获取所有数字: 20180101 , 20180102 ...

这是我的代码:

sREG.Global = True
sREG.MultiLine = True
sREG.IgnoreCase = True    
sREG.Pattern = "var fixedDays =\[(?:'(\d{8}):[V|W]',?)+\];"
Set sRES = sREG.Execute(big_string)

但它只返回最后一个数字 20180203。

我知道这与贪婪/懒惰的量词有关,但无法做到。

标签: regexvbaregex-groupregex-greedy

解决方案


我建议使用与 DisplayName 发布的方法类似的方法,但仅在您获得匹配项之后:

Dim big_string As String
Dim sREG As New RegExp
Dim result As Variant
Dim sRES As MatchCollection

big_string = "var fixedDays =['20180101:V','20180102:V','20180106:W','20180107:W','20180113:W','20180114:W','20180120:W','20180121:W','20180124:V','20180127:W','20180128:W','20180203:W'];"

With sREG
 .Global = True
 .Pattern = "var fixedDays\s*=\s*\[((?:'\d{8}:[VW]',?)+)];"
 .IgnoreCase = True
End With

Set sRES = sREG.Execute(big_string)
If sRES.Count > 0 Then
  result = Split(Replace(Replace(Replace(sRES(0).SubMatches(0), "'", ""), ":V", ""), ":W", ""), ",")
End If

输出:

在此处输入图像描述

您实际上可以将匹配项收集到一个集合中。

正则表达式 ,var fixedDays\s*=\s*\[((?:'\d{8}:[VW]',?)+)];将匹配var fixedDays带有=0+ 个空格的 a ,然后[, 然后((?:'\d{8}:[VW]',?)+)将捕获到第 1 组的单引号 8 位数字,带有:Vor:W前缀,后跟可选的,. 然后,];将得到匹配。


推荐阅读