środa, 31 lipca 2013

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

Zanim uruchomimy pierwszą pełną procedurę z wykorzystaniem techniki wyrażeń regularnych (RegExp) przyjrzyjmy się dodatkowo właściwościom obiektu RegExp

.Pattern       pozwoli nam zdefiniować wzorzec porównawczy,
.Global        określa, czy wzorzec dotyczy pierwszego (= False), 
               czy wszystkich wystąpień w tekście (= True),
.IgnoreCase    określa sposób testowania wyrażenia ze względu na wielkość liter (domyślnie =False,
               wyszukiwanie binarne uwzględniające wielkość liter),

oraz metodom obiektu Regexp:
.Test       zwraca informację czy można dopasować wyrażenie do ciągu tekstowego,
.Replace    dokonuje zamiany fragmentu wzorcowego na nowy wskazany ,
.Execute    wykonuje operację zwracając obiekt Match z kolekcji MatchCollection.

W dużym skrócie podsumowując powyższe elementy obiektu  RegExp określę to w sposób następujący- pozwalają one na wskazanie wzorca a następnie dokonanie zamiany fragmentu tekstu na inny lub pobranie poszczególnych elementów w całości lub dla pierwszego wystąpienia.

Czas na zebranie całości zagadnienia w konkretne rozwiązania i prezentację przykładowych pełnych konstrukcji kodu VBA. Wykonując poniższe operacje w środowisku VBA proszę nie zapomnieć o Kroku 1, a więc ustanowieniu referencji do biblioteki RegExp.

Przykład 1. zamiana wyrazów w ciągu tekstowy, wyraz 'jest' na 'był'

01Dim objRE As New RegExp
02Dim Tekst As String
03Dim Wynik As Variant
04 
05Tekst = "To jest 123 tekst 45! 6 Zawiera też 789 liczby 0."
06With objRE
07    .IgnoreCase = True
08    .Global = True
09    .Pattern = "jest"
10    Wynik = .Replace(Tekst, "był")
11End With
12Debug.Print Wynik    '>> To był 123 tekst 45! 6 Zawiera też 789 liczby 0.

Przykład 2. z podanego ciągu tekstowego pozostawić tylko cyfry
 
01Dim objRE As New RegExp
02Dim Tekst As String
03Dim Wynik As Variant
04 
05Tekst = "To jest 123 tekst 45! 6 Zawiera też 789 liczby 0."
06With objRE
07    .Global = True
08    .Pattern = "[a-żA-Ż!?.]*\s*"
09    Wynik = .Replace(Tekst, vbNullString)
10End With
11Debug.Print Wynik    '>> 1234567890

Przykład 3. z podanego ciągu tekstowego usunąć wszystkie liczby

01Dim objRE As New RegExp
02Dim Tekst As String
03Dim Wynik As Variant
04 
05Tekst = "To jest 123 tekst 45! 6 Zawiera też 789 liczby 0."
06With objRE
07    .Global = True
08    .Pattern = "\d"
09    Wynik = .Replace(Tekst, vbNullString)
10End With
11Debug.Print Wynik    '>> To jest  tekst !  Zawiera też  liczby

Przykład 4. W przykładzie nr 2 dodatkowo pozostały podwójne spacje oraz zbędna spacja przed kropką i wykrzyknikiem. To wszystko także chcemy usunąć i wyprostować. W tej sytuacji utworzymy kaskadowy mechanizm RegExp:
01Dim objRE As New RegExp
02Dim Tekst As String
03Dim Wynik As Variant
04 
05Tekst = "To jest 123 tekst 45! 6 Zawiera też 789 liczby 0."
06With objRE
07    .Global = True
08'usuwamy liczby
09    .Pattern = "\d"
10    Wynik = .Replace(Tekst, vbNullString)
11'usuwamy spacje podwójne
12    .Pattern = "\s{2,}"
13    Wynik = .Replace(Wynik, " ")
14'usuwamy spację przed znakami specjalnymi...
15    .Pattern = "(\s)([.!?])"
16'...stosując technikę zamiany
17    Wynik = .Replace(Wynik, "$2")
18End With
19Debug.Print Wynik    '>>To jest tekst! Zawiera też liczby.

Przykład 5. W powyższym przykładzie zastosowana została technika zamiany kolejności wyrazów. Jest to jedna z wielu dodatkowych korzyści pracy z RegExp. Poniżej prosty przykład, który zamienia kolejność 3 pierwszych wyrazów podanego tekstu:
01Dim objRE As New RegExp
02Dim Tekst As String
03Dim Wynik As Variant
04 
05Tekst = "To jest 123 tekst 45! 6 Zawiera też 789 liczby 0."
06With objRE
07'ważne ustawienie dot. właściwości Global
08    .Global = False 
09    .IgnoreCase = True
10    .Pattern = "(\S+)(\s+)(\S+)(\s+)(\S+)*"
11    Wynik = .Replace(Tekst, "$5$4$3$2$1")
12End With
13Debug.Print Wynik   '>>123 jest To tekst 45! 6 Zawiera też 789 liczby 0.

Przykład 6. Z podanego tekstu chcemy pobrać tylko adres e-mai. W tym celu wykorzystamy jeden z wielu możliwych wzorców odpowiadających adresowi e-mail i stworzymy następujący kod:
01Dim objRE As New RegExp
02Dim Tekst As String
03Dim Wynik As Variant
04 
05Tekst = "Ten tekst zawiera email gdzieś adres.email@domena.com.pl w swojej treści."
06With objRE
07    .Global = True
08    .Pattern = _
09    "([A-Za-z0-9_\.-]+)@([A-Za-z0-9_\.-]+[A-Za-z0-9_][A-Za-z0-9_])"
10    If .test(Tekst) Then
11        Wynik = .Execute(Tekst)(0).Value
12    End If
13End With
14Debug.Print Wynik

Powyższy przykład zamiast metody .Replace wykorzystuje metodę .Execute. Ale o tym napiszę już w kolejnym wpisie za kilka dni...


Osobom, które są zainteresowane wyrażeniami regularnymi polecam poniższe linki, które pozwolą na poszerzenie i ugruntowanie informacji przedstawionych w ostatnich postach. Linki te poświęcone są ogólni RegExp i niekoniecznie wskazują na bezpośrednie wykorzystanie tej techniki w VBA.

Korzystanie z wyrażeń regularnych w programie Microsoft Visual Basic 6.0Regular-Expressions.Info
.NET Framework Regular Expressions
RegExp Help
Regular-Expressions.info
Introduction to Regular Expressions

Brak komentarzy:

Prześlij komentarz