środa, 17 lipca 2013

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

W trzech kolejnych postach poświęconych tematyce testowania zgodności ciągów tekstowych przedstawię technikę zwaną potocznie: 'wyrażenia regularne' (ang. regular expressions, powszechnie używane skróty to także RegExp czy RegEx). Wprawne oko czytającego mogło dostrzec, że ten i kolejny post w temacie pracy z tekstem zmieniły tag określający poziom zagadnienia. Temat ten należy bowiem zdecydowanie zaliczyć do zaawansowanych umiejętności programowania.

Zagadnienie związane z wyrażeniami regularnymi (od teraz zwanymi RegExp) jest tematem bardzo obszernym. Postaram się możliwie krótko i prosto przedstawić zagadnienie na tyle, aby móc na końcu zaprezentować praktyczne wykorzystanie. Wszystkich zainteresowanych odsyłam do linków, które zostaną podane pod koniec lub do własnych poszukiwań w Internecie.

Zanim przejdziemy do omówienia zagadnienia kroku po kroku krótka odpowiedź na pytanie 'do czego szczególnie przyda się umiejętność wykorzystania RegExp?':

A) cel podstawowy- weryfikacji, czy dany ciąg tekstu spełnia określone skomplikowane założenia co do składni, a więc nie tylko sprawdzenie, czy tekst zaczyna się, czy kończy lub czy zawiera określony inny tekst,
B) do wykonania operacji typu Find >> Replace dla skomplikowanych składni tekstowych
C) odnajdywania i zwracania wybranych składni tekstu, np. liczb z danego ciągu tekstowego, albo tego samego ciągu pozbawionego liczb,
D) wyszukiwania adresów e-mail czy adresów internetowych w zbiorze innych wartości tekstowych, itp.

Wykorzystanie techniki RegExp wymagać będzie od nas:
Krok 1) utworzenia referencji do zewnętrznej biblioteki- i o tym napiszę w niniejszym poście,
Krok 2) umiejętności tworzenia wzorców szukanego tekstu- chyba najważniejsza umiejętność w korzystaniu z RegExp, i o tym w kolejnym poście,
Krok 3) umiejętności wykorzystania metod, właściwości, obiektów i kolekcji RegExp lub z RegExp związanych.

Krok 1. 
Wykorzystanie RegExp wymaga od nas ustanowienia referencji do zewnętrznej biblioteki. W tym celu korzystając z jednej z technik wiązań naszą procedurę lub funkcję musimy wzbogacić o następujące alternatywne instrukcje:

wariant A) dla wiązana późnego:

wariant B) dla wiązania wczesnego w pierwszej kolejności musimy dodać referencję do biblioteki Microsoft VBScript Regular Expressions 5.5 (Edytor VBA >> Tools >> References >> odnajdujemy i zaznaczamy wskazaną bibliotekę >> OK). Sam kod będzie miał następującą postać:

Z którego wariantu warto skorzystać? Z praktycznego punktu widzenia- jeżeli tworzony kod nie będzie dystrybuowany zdecydowanie powinniśmy sięgnąć po wariant B, jeżeli jednak tworzymy rozwiązanie dla innych użytkowników powinniśmy zastosować wariant A.
(W sprawie dodatkowych informacji dot. wczesnego i późnego wiązania odsyłam do naszych kursów lub do informacji znajdujących się w sieci.)

środa, 10 lipca 2013

Testowanie zgodności ciągów tekstowych- podstawy- 2/2

Kontynuując tematykę pracy z tekstem i szukania odpowiedzi na pytanie 'czy tekst B spełnia określone kryteria zgodności z tekstem A?' zaprezentuje technikę opartą o wykorzystanie operatora Like.

Ogólna konstrukcja wykorzystania operatora opiera się o schemat:

tekst_A Like wzorzec_B

gdzie w strukturze wzorca dostępne są następujące znaki i bloki specjalne
*        dowolny ciąg tekstu lub ciąg pusty
?        pojedynczy znak- litera lub cyfra
#        pojedyncza cyfra 0 do 9
[zakres]    wskazany zakres znaków, liter, cyfr
[!zakres]   wskazany zakres znaków, liter, cyfr nie uwzględniany w wyszukiwaniu

Spójrzmy jednak na przykłady w celu zrozumienia zastosowania operatora Like.Tym razem naszym badanym tekstem będzie następujący ciąg:
A = "Lorem ipsum dolor 100 sit amet, consectetuer adipiscing elit."

1. Czy w tekście A znajduje się określony fragment tekstu?

Proszę pamiętać, że domyślne porównanie tekstowe odbywa się w sposób binarny, a więc taki, który rozróżnia wielkość liter. Jednym ze sposobów obejścia tego problemu jest zastosowanie następującej techniki:

2. Czy tekst A zaczyna się od małej litery?

3. A może tekst zaczyna się od dowolnej litery (nie cyfry, nie znaku specjalnego)?

Uwaga, nie możemy zapisać zapytania jako "[A-z]" gdy pomiędzy literami A-Z i a-z znajduje się zestaw znaków specjalnych. Można to sprawdzić w następujący sposób (wraz z listą zwracanych wartości):

Jak więc widać powyżej zakresy znaków ujęte w kwadratowych nawiasach [] odpowiadają znakom w kolejności zgodnej z numeracją ANSI.

4. Czy tekst kończy się na literę lub liczbę?

5. A może tekst kończy się wybranym znakiem specjalnym?

6. Sprawdźmy czy tekst zawiera liczbę trzy- lub cztero-cyfrową?

7. Weryfikacja czy tekst jest zdaniem wymaga sprawdzenia, czy zaczyna się od litery wielkiej i kończy jednym ze znaków specjalnych?

8. A na koniec kilka drobnych przykładów, które zwracają wartość TRUE dla analizowanego ciągu tekstowego:

Wszystkich zainteresowanych szerzej zagadnieniem zastosowania opeartora Like odsyłam bezpośrednio do pomocy VBA na stronach Microsoft MSDN:
Like Operator
Comparing Strings by Using Comparison Operators