poniedziałek, 22 lipca 2013

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

Kontynuując temat tworzenia wyrażeń regularnych RegExp omówię najważniejszą umiejętność związaną z tą techniką, a więc budowanie wzorców porównawczych.
 

Krok 2.
To najtrudniejsza część pracy z RegExp- budowa składni tworzącej kryteria. Spojrzymy na to zadanie najpierw przez pryzmat wybranych znaków (kodów) specjalnych, następnie przedstawię proste przykłady, a na koniec zaprezentuję kilka złożonych wzorców.

A) Znaki i symbole specjalne
\d    cyfra
\D    nie cyfra
\s    spacja
\S    nie spacja
\w    znak alfanumeryczny, litera
\W    nie znak alfanumeryczny
\b    granica słowa, pozycja między słowem a spacją
\n    znak nowej linii (vbCrLf, Chr(10), Chr(13), vbNewLine)
\r    znak nowej linii (Chr(13))
\t    znak tabulacji (vbTab)
.     (kropka) dowolny znak z wyjątkiem znaku nowej linii
*     powtórzenie symbolu dowolną ilość lub zero razy
?     powtórzenie symbolu zero lub jeden raz
+     powtórzenie poprzedniego wyrażenia co najmniej raz
\     używany jako znak wyjścia dla znaków specjalnych
^     na początku tekstu
      także symbol zaprzeczenia(patrz poniżej)
$     na końcu tekstu
[]    przedział znaków
      [A-Z]  dowolna wielka litera
      [a-z]  dowolna mała litera
      [0-9]  dowolna cyfra
      [^0-9] nie zawiera cyfry
{}    wskazuje ilość dopuszczalnych powtórzeń: 
      a{1}   jednokrotne powtórzenie litery a
      a{0,2} zero do dwóch powtórzeń litery a
()    grupowanie
|     alternatywa dla grupowania

Proszę jednocześnie pamiętać, że dla prostych wyrażeń bez udziału powtórzeń i znaków specjalnych zastosujemy technikę podobną do tej opisanej przy pracy z operatorem Like w jednym z wcześniejszych postów. RegExp jest także, co do zasady, wrażliwy na wielkość liter

Spójrzmy na przykłady:
RegExp Pattern   Dopasowanie    Wyjaśnienie (opcjonalne)
           (czerwonym-dopasowanie)
abc              abcabcabc
234              1234567
Jan              Jan
                 Janek
                 janek          wielkość liter ma znaczenie
ab*c             acde
                 abcde
                 abbbbcde
ab?c             acde
                 abcde
                 abbbcde        brak dopasowania
ab+c             acde           brak dopasowania
                 abcde
                 abbbcde
ab.d             abcd
                 ab1d
                 abc1d          brak dopasowania 
a.*d             ad
                 abcd
                 asfas13wbd
\d\d             10
                 99
                 100
                 9999           dwa podwójne układy cyfr
\w+              alfa           dowolny, każdy wyraz
                 Witaj Jan! 
\w+@\w+          a@a            uproszczony schemat dla e-maila
                 email@domena.pl
\w+@\w+.\w+      email@domena.pl
                 jan.kowalski@domena.pl
^ab.*c           abc
                 ab123fdcdef
                 babc           tekst nie zaczyna się od a
^ab.*c$          abc
                 ab123c
                 ab123cd        nie kończy się na c
                 ab123cdc       powtórzenie c nie ma znaczenia
                 bacdc          nie zaczyna się od a
^\d              1abc           zaczyna się od cyfry
\d$              abc1           kończy się cyfrą
[abc]            abc            znaki wskazane w nawiasie
                 abcdef
                 abcdefabc   
[^abc]           abcdefabc      nie a, nie b, nie c     

[A-Z]            abcDEF         wielkie litery
                 ABCDEF
                 abcdef
^[A-Z].+         Abc123d        zaczyna się od wielkiej litery
                 abc123d
[+*?.]           ..??**++       nawiasy likwidują znaczenie znaków specjalnych
^[1-9][0-9]*$    1              liczba całkowita większa od zera
                 1000
                 -1000
                 123.45         tylko liczba całkowita
(ab)+            ab
                 ababab
                 bababa
(ab|ba)+         ab
                 ba
                 ababab         rozpozna jako jeden ciąg
                 bacbacab       rozpozna trzy ciągi
                 abcdef
(abc)?           abc            ale także dla pustego ciągu
a(\d+)c          a123c          zawiera cyfry pomiędzy a i c
                 a1c
                 ac
                 abc  
a{2}             alfaabeta
a{1,2}           alfaabeta

Inne gotowe przykłady z tego źródła:
A) weryfikacja, czy podano prawidłowy e-mail:
^[A-Za-z0-9_\.-]+@[A-Za-z0-9_\.-]+[A-Za-z0-9_][A-Za-z0-9_]$

Wskazówka! w sieci znaleźć można wiele przykładów weryfikacji adresów e-mail, kolejny z nich podam w trzeciej lekcji poświęconej RegExp. Zainteresowanych tym zagadnieniem odsyłam do tej dyskusji.

B) weryfikacja zapisu daty w układzie: yyyy-MMM -dd, gdzie MMM to trzyliterowy skrót zapisany z wielkiej litery:
^\d\d\d\d-[A-Z][a-z][a-z]-\d\d$

C)  weryfikacja daty jak powyżej rozszerzona, sprawdzamy, czy miesiąc podany w języku polskim lub angielskim:
^20\d\d-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(0[1-9]|[1-2][0-9]|3[01])$ 

^20\d\d-(Sty|Lut|Mar|Kwi|Maj|Cze|Lip|Sie|Wrz|Paź|Lis|Gru)-(0[1-9]|[1-2][0-9]|3[01])$


Brak komentarzy:

Prześlij komentarz