У меня есть следующая подстрока
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 .
Я знаю, что это связано с жадными / ленивыми кванторами, но не может этого сделать.
решение VBA, но не Regex one:
Dim fixedDays As String
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'"
Dim str As Variant
For Each str In Split(Replace(Replace(Replace(fixedDays, "'", ""), ":W", ""), ":V", ""), ",")
Debug.Print str
Next
Я предлагаю аналогичный подход к тому, который отправлен 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+, затем [, а затем ((?:'\d{8}:[VW]',?)+) захватить в группу 1 однокасканные 8-значные цифры с префиксами :V или :W, а затем с опцией ,. Затем ]; будет соответствовать.