Повторяющаяся группа регулярных выражений 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 .

Я знаю, что это связано с жадными / ленивыми кванторами, но не может этого сделать.

0
задан 13 August 2018 в 16:12

2 ответа

решение 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
0
ответ дан 15 August 2018 в 16:58

Я предлагаю аналогичный подход к тому, который отправлен 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, а затем с опцией ,. Затем ]; будет соответствовать.

0
ответ дан 15 August 2018 в 16:58

Другие вопросы по тегам:

Похожие вопросы: