regex - 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。
我知道这与贪婪/懒惰的量词有关,但无法做到。
解决方案
我建议使用与 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 位数字,带有:V
or:W
前缀,后跟可选的,
. 然后,];
将得到匹配。
推荐阅读
- php - 卷曲错误:14094410:SSL 例程:ssl3_read_bytes:sslv3 警报握手失败
- android - Exoplayer Android - 在播放另一个 MP3 时开始下载渐进式 MP3
- c# - Web api背后的应用程序/业务逻辑和UI中的验证错误?
- abap - 更新的记录不显示在子屏幕 ALV 中
- angular - 处理多个垫子错误
- reactjs - 如何初始化 MobX 状态树的叶/子存储
- html - 在 ng-repeat 中循环两个数组
- ios - Firebase 动态链接未打开 iOS 应用程序
- spring-boot - @SqlResultSetMapping 可以用来映射复杂的 Dto 对象吗
- git - 如何修复“未处理的变基类型 1”Git 错误