Извлеките и распечатайте нужные значения с помощью регулярного выражения, оставив остальные без изменений - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть массив «arr» с содержимым, как вы можете видеть в коде

Sub z()
Dim regex As Object, allMatches As Object, match As Object
Dim arr(1 To 16)
Dim str As String

arr(1) = "{ value:{90914793497} }"
arr(2) = "{ iPBAdd:{iPBV4Add:{192.168.1.15}} }"
arr(3) = "859272608"
arr(4) = "pocbh"
arr(5) = "0x00 01"
arr(6) = "{ iPAdd:{iPBAdd:{iPBV4Add:{192.168.33.1}}} }"
arr(7) = "TRUE"
arr(8) = "{ :{qRd:{-} dVGU:{1280} dVGD:{4224} cC:{rC} cT:{2018-09-21 14:05:30 -03:00 } uLI:{-} eInf:{qCI:{9} mRB:{-} rth:{5} aMBL:{-}}} }"
arr(9) = "2/21/2019 14:04"
arr(10) = "39"
arr(11) = "normalR"
arr(12) = "{ mSCause:{1} }"
arr(13) = "{ value:{677607185} }"
arr(14) = "GMT"
arr(15) = "-"
arr(16) = "{ :{GHH} }"

Set regex = CreateObject("vbscript.regexp")
With regex
    .Global = True
    .MultiLine = False
    .Pattern = "\b[\d\.\-: ]+\b"
End With

For i = 1 To 16
    Set allMatches = regex.Execute(arr(i))
    For Each match In allMatches
        If i = 8 Then
            str = str & "|" & match.Value
        Else
            str = match.Value
        End If
    Next
    If i = 8 Then
        Debug.Print Trim(Mid(str, 2, Application.Search(" -", str) - 2))
    Else
        Debug.Print Trim(str)
    End If
    str = ""
Next
End Sub

Я хочу извлечь все значения, которые находятся в пределах {}.Обычно каждый элемент массива имеет только одно значение между {}, но для элемента arr (8) есть несколько значений в пределах {}, и для этого элемента мне нужно только значение после dVGU, dVGD и date / hout без -03:00

Мой код почти все работает, извлекает нужные значения, но я хочу также напечатать значения, которые не совпадают.

Мой текущий вывод:

90914793497
192.168.1.15
859272608

01
192.168.33.1

1280|4224|2018-09-21 14:05:30
2019 14:04
39

1
677607185

и я хотел бы, чтобы вывод был таким

90914793497                                          
192.168.1.15                 
859272608                    
pocbh                        
0x00 01                      
92.168.33.1                  
TRUE                         
1280|4224|2018-09-21 14:05:30
2/21/2019 14:04              
39                           
normalR                      
1                            
677607185                    
GMT                          
-                            
GHH     

, поэтому в выводе отсутствуют pocbh, 0x00 01, TRUE, normalR, GMT, -, GHH

Как я могу это исправить?

1 Ответ

0 голосов
/ 22 февраля 2019

Вы можете просто проверить, есть ли сначала строка {.Если нет, установите str в значение массива.

...
For i = 1 To 16
    If InStr(1, arr(i), "{") = 0 Then 
        str = arr(i)
    Else
        Set allMatches = regex.Execute(arr(i))
        For Each match In allMatches
            If i = 8 Then
                str = str & "|" & match.Value
            Else
                str = match.Value
            End If
        Next
        If allMatches.Count = 0 Then
            str = alternate_pattern(CStr(arr(i)))
        End If
    End If
    If i = 8 Then
        Debug.Print Trim(Mid(str, 2, Application.Search(" -", str) - 2))
    Else
        Debug.Print Trim(str)
    End If
    str = ""
Next
End Sub

Function alternate_pattern(str As String) As String
Dim regex As Object, matches As Object
Set regex = CreateObject("vbscript.regexp")
With regex
    .Global = True
    .MultiLine = False
    .Pattern = "\b[\w\.\-: ]+\b"
End With

Set matches = regex.Execute(str)
If matches.Count > 0 Then
    alternate_pattern = matches(0)
Else
    alternate_pattern = str
End If

End Function

output:

90914793497
192.168.1.15
859272608
pocbh
0x00 01
192.168.33.1
TRUE
1280|4224|2018-09-21 14:05:30
2/21/2019 14:04
39
normalR
1
677607185
GMT
-
GHH

Обратите внимание, что, скорее всего, есть лучший способ учета конца GHH.Ваш текущий шаблон регулярных выражений ищет только числа (используя \d), а в некоторых случаях у вас есть буквы в {}.Вот что проверяет alternate_pattern.

Я не так хорош с Regex, но я думаю, что вы могли бы сделать там заявление OR или сгруппировать их?...Я не знаю.Дело в том, что это можно улучшить наверняка, но, похоже, работает с образцами, которые у вас есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...