poniedziałek, 5 sierpnia 2013

Testowanie zgodności ciągów tekstowych- wyrażenia regularne RegExp- 4/4

W ostatnim wpisie dot. wyrażeń regularnych RegExp chciałbym zwrócić uwagę metodę .Execute, którą wykorzystałem poprzednio w celu odnalezienia i pobrania adresu e-mail z podanego ciągu tekstowego.

Metoda .Execute zwraca kolekcję Matches Collection, która zawiera wszystkie wystąpienia ciągów tekstowych spełniających określone kryteria.  W tej sytuacji w relatywnie łatwy sposób możemy pobrać elementy odpowiadające naszemu wzorcowi.

Prześledźmy to na jednym tylko przykładzie, którego zadaniem będzie pobranie wszystkich adresów e-mail z podanego ciągu tekstowego. W zakresie dalszego zrozumienia zastosowania kolekcji Matches odsyłam do komentarzy w poniższym kodzie.

01Sub RegExp_pobranie_wybranych()
02 
03    'proszę pamiętać o referencji do biblioteki RegExp
04    Dim objRE As New RegExp
05    Dim Tekst As String
06    Dim Wynik As Variant
07    
08    'nasz przeszukiwany tekst- zawiera 3 e-maile w różnych zapisach
09    Tekst = "Tekst zawiera e-maile adres.email@domena.com.pl w treści. " & _
10            "E-maile jan.kowalski@domena.pl są na różnych pozycjach. " & _
11            "regexp_cool@domena.com oraz posiadają różną konstrukcję."
12    
13    With objRE
14        .Global = True
15        .Pattern = _
16        "([A-Za-z0-9_\.-]+)@([A-Za-z0-9_\.-]+[A-Za-z0-9_][A-Za-z0-9_])"
17        If .test(Tekst) Then
18            'Ważne! nasz wynik jest obiektem typu Match,
19            'wymaga użycia instrukcji Set!
20            Set Wynik = .Execute(Tekst)
21        End If
22    End With
23    
24    'zwracamy wynik- wszystkie pobrane e-maile
25    Dim EMail As Match
26    For Each EMail In Wynik
27        Debug.Print EMail.Value
28    Next
29    'inny sposób na zwrócenie odnalezionych e-maili
30        Debug.Print Wynik(0).Value
31        Debug.Print Wynik(1).Value
32        Debug.Print Wynik(2).Value
33    
34    'dodatkowo możemy pobrać także inne parametry
35    'odnalezionych fragmentów tekstu
36    
37    For Each EMail In Wynik
38        'adres e-mail, pozycja w tekście, długość tekstu e-maila
39        Debug.Print EMail.Value, EMail.FirstIndex, EMail.Length
40    Next
41End Sub

Brak komentarzy:

Prześlij komentarz