Jesteś tutaj: Główna → Wyrażenia regularne → 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).
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.
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].
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 :-)
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ż
^ nie należy
umieszczać go na początku;
- najbezpieczniej umieścić go
jako ostatni znak w zakresie;
Dlatego też nie [^%$#@!], a
– na przykład – [!@#$%^] i
nie [a-c], gdy chcemy dopasować
a, c lub
-, a [ac-].