Jesteś tutaj: GłównaWyrażenia regularne → Klasy znakowe. Daszek.

Klasy znakowe. Daszek.

Klasy znakowe służą do wyszukiwania znaków, które spełniają (bądź nie spełniają, ale o tym później) pewien warunek; można powiedzieć, że klasy znakowe są pewnym szczególnym - uszczegółowionym - rodzajem kropki.

Chcąc użyć klasy znakowej możemy podać zakres, odwołać się do jednej z predefiniowanych klas znakowych, odwołać się do jednej z predefiniowanych klas POSIX albo użyć jednej z właściwości Unicode (do zrobienia, tego jest naprawdę sporo, chwilowo jedynie link do oficjalnej strony Unicode o właściwościach właśnie).

Zakresy

Zakres definiujemy za pomocą nawiasów kwadratowych, w których umieszczamy znaki, które chemy dopasować: [znaki]. I tak, wyrażenie regularne ko[cs] dopasuje słowa koc i kos (jak również skoczek i koszyczek), zaś [abcdefghijklmnopqrstuvwxyz] dopasuje dowolną (małą!) literę z alfabetu łacińskiego; w tym konkretnym przypadku, zamiast pracowicie wypisywać wszystkie znaki można napisac [a-z], osiągając ten sam efekt. Cyfrę szesnastkową dopasujemy, wpisując wzorzec [0-9A-Fa-f].

Ważna rzecz – jeśli podane wewnątrz zakresu, metaznaki traktowane są literalnie, co oznacza, że, przykładowo [.] dopasuje znak kropki.

Predefiniowane klasy znakowe

W celu zaoszczędzenia czasu programistów (i zwykłych użytkowników również!) wprowadzono następujące predefiniowane klasy znakowe, używanie których znakomicie ułatwia życie i zwiększa czytelność wyrażenia regularnego, co również nie jest bez znaczenia:

Symbol Co znaczy
\d Cyfra
\D Znak inny niż cyfra
\w Znak wyrazu
\W Znak inny niż znak wyrazu
\s Odstęp
\S Znak inny niż odstęp

W tym miejscu należy - gwoli kompletności - dodać, że \t oznacza znak tabulacji, \n - znak końca linii LF, \r - nieśmiertelny powrót karetki CR, a \f dopasowuje znak wysunięcia arkusza FF.

Przykładowo, chcąc dopasować cyfrę szesnastkową, możemy skrócić wyrażenie [0-9A-Fa-f], pisząc [\dA-Fa-f].

Predefiniowane klasy POSIX

Standard POSIX definiuje własne klasy znakowe, dodatkowo również rozszerzając je o symbole łączone i klasy równoważności. Zapewniają one poprawną obsługę języków innych niż angielski (to miło, że twórcy standardu pomyśleli o innych narodach).

Poniżej umieściłem zestawienie wszystkich klas POSIX:

Symbol Co dopasowuje
[:alnum:] Znaki alfanumeryczne
[:alpha:] Litery
[:blank:] Spacja i znak tabulatora
[:cntrl:] Znaki sterujące
[:digit:] Cyfry
[:graph:] Znaki drukowalne (widoczne), bez znaków odstępu (które są oznaczane jako klasa \f w standardowej notacji)
[:lower:] Małe litery
[:print:] Znaki drukowalne (teraz z odstępem)
[:punct:] Znaki przestankowe
[:space:] Znaki odstępu (klasa \s)
[:upper:] Wielkie litery
[:xdigit:] Cyfry szesnastkowe

Symbole łączone (ang.: collating elements) do dwuznaki występujące w różnych językach. Nie jest ich dużo, niemniej, dla pewnych grup językowych są one na pewno bardzo istotne. Symbole łączone oznacza się za pomocą [.symbol łączony.]; na przykład [[.ch.]] odpowiada symbolowi łączonemu ch.

Klasy równoważności są nieco bardziej przydatne; oznaczane są przy użyciu znaku równości [=znak=]. Odpowiadają one znakom, które są ze sobą „utożsamiane”. Dla polskiego LOCALE mogą to być litery e oraz ę, które dopasowane zostaną przez wyrażenie [[=e=]].

Warto w tym miejscu nadmienić, że klasy POSIX zawsze są wzięte w nawiasy kwadratowe, przez co, chcąc ich użyć, musimy otoczyć je dodatkowymi nawiasami (jak w powyższych przykładach).

Dopasowanie cyfry szesnastkowej przy użyciu klas POSIX jest naprawdę bardzo proste :-)

Karetka. Daszek.

A co jeśli nie chcemy dopasować litery a? Proste. Wystarczy użyć znaku negacji, czyli daszka ^ w połączeniu z podaniem zakresu.

I tak [^a] dopasuje wszystkie znaki różne od litery a, [^\d] wszystko, co nie jest cyfrą, zaś [^\da-fA-F] wszystko, co nie jest cyfrą szesnastkową.

W tym miejscu dwie uwagi – ze względu na to, że zarówno -, jak i ^ mają specjalane znaczenie, jeśli umieścić je w nawiasach kwadratowych, dlatego też

Dlatego też nie [^%$#@!], a – na przykład – [!@#$%^] i nie [a-c], gdy chcemy dopasować a, c lub -, a [ac-].