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ł'
01 | Dim objRE As New RegExp |
05 | Tekst = "To jest 123 tekst 45! 6 Zawiera też 789 liczby 0." |
10 | Wynik = .Replace(Tekst, "był" ) |
Przykład 2. z podanego ciągu tekstowego pozostawić tylko cyfry
01 | Dim objRE As New RegExp |
05 | Tekst = "To jest 123 tekst 45! 6 Zawiera też 789 liczby 0." |
08 | .Pattern = "[a-żA-Ż!?.]*\s*" |
09 | Wynik = .Replace(Tekst, vbNullString) |
Przykład 3. z podanego ciągu tekstowego usunąć wszystkie liczby
01 | Dim objRE As New RegExp |
05 | Tekst = "To jest 123 tekst 45! 6 Zawiera też 789 liczby 0." |
09 | Wynik = .Replace(Tekst, vbNullString) |
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:
01 | Dim objRE As New RegExp |
05 | Tekst = "To jest 123 tekst 45! 6 Zawiera też 789 liczby 0." |
10 | Wynik = .Replace(Tekst, vbNullString) |
13 | Wynik = .Replace(Wynik, " " ) |
15 | .Pattern = "(\s)([.!?])" |
17 | Wynik = .Replace(Wynik, "$2" ) |
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:
01 | Dim objRE As New RegExp |
05 | Tekst = "To jest 123 tekst 45! 6 Zawiera też 789 liczby 0." |
10 | .Pattern = "(\S+)(\s+)(\S+)(\s+)(\S+)*" |
11 | Wynik = .Replace(Tekst, "$5$4$3$2$1" ) |
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:
01 | Dim objRE As New RegExp |
05 | Tekst = "Ten tekst zawiera email gdzieś adres.email@domena.com.pl w swojej treści." |
09 | "([A-Za-z0-9_\.-]+)@([A-Za-z0-9_\.-]+[A-Za-z0-9_][A-Za-z0-9_])" |
11 | Wynik = .Execute(Tekst)(0).Value |
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