Środowisko programisty/Wyrażenia regularne: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Pan (dyskusja | edycje)
Pozycjonowanie: Pierwsza wersja
Pan (dyskusja | edycje)
Znak opcjonalny: Pierwsza wersja
Linia 66: Linia 66:


=== Znak opcjonalny ===
=== Znak opcjonalny ===
Znak specjalny '''?''' mówi, że poprzedzający element może wystąpić, bądź też nie. Na przykład wyrażenie '''-?[0-9][0-9]*''' oznacza dowolny niepusty ciąg cyfr, być może poprzedzony znakiem '''-'''. Czyli takie wyrażenie może służyć do rozpoznawania dowolnej liczby całkowitej (jeżeli dopuścimy to, że zapis dziesiętny liczby może mieć wiodące zera).


=== Wyrażenia rozszerzone ===
=== Wyrażenia rozszerzone ===

Wersja z 15:21, 9 sie 2006

Po co są wyrażenia regulrane?

Częstym zadaniem, które wykonuje się podczas pracy z komupterm (najogólniej rzecz ujmując) jest wyszukiwanie danego kawałku tekstu w jakimś pliku, zmienianie go, sprawdzanie, czy dany tekst się w tym pliku znajduje. Generalnie potrzebujemy narzędzi do znajdywania wzorca o zadanej charakterystyce w jakimś większym tekście. Tą charakterystekę musimy jakoś podawać. W najprostszym przypadku podajemy po prostu tekst jaki chcemy znaleźć. Na przykład, aby znaleźć wszystkie linie w pliku tekst.txt, w których znajduje się fragment est, wystarczy wykonać polecenie

grep est tekst.txt

Wtedy dla pliku tekst.txt o zawartości

To jest plik tekstowy.
Testujemy narzędzie grep.
Trzecia linia.
A to czwarta linia.
To jest piąta linia.

w wyniku otrzymamy

To jest plik tekstowy.
Testujemy narzędzie grep.
To jest piąta linia.

Zamiast wyszukiwać danej frazy, możemy chcieć znajdować bardziej skomplikowe wzorce, jak na przykład wszystkie adresy email, które znajdują się w danym tekście, czy też wszystkie odmiany słowa pies. W tych celach potrzebne są bardziej zaawansowane możliwości podawania charakterystyki frazy, którą chcemy szukać. Taką możliwość dają właśnie wyrażenia regularne.

Składnia

Znaki

Najprostrze wyrażenia regularne składają się z ciągu znaków. Niektóre znaki są specjalne, więc aby rozpoznać, któryś z nich trzeba poprzedzać go backslashem. Następujące znaki są specjalne: . ^ $ * ? [ ] \. Na przykład, aby wyszukać w tekście frazy \abc[?] używamy wyrażenia \\abc\[\?\].

Klasy znaków

Przypuśćmy, że chcemy znajdować wystąpienie jednego z łańcuchów psa, psu i psy. Zatem pierwsze dwa znaki są ustalone i są to ps. Natomiast przy trzecim znaku mamy pewną dowolność. Chcemy, aby trzeci znak mógł być równy albo a, albo u, albo y. Do tego służą klasy znaków. Listę znaków, którą chcemy mieć rozpoznawaną umieszczemy pomiędzy nawiasami kwadratowymi: [auy]. Nasze wyrażenie wygląda więc tak: ps[auy].

bashtest@host:~$ grep ps[auy] <<KONIEC
> psami
> psom
> psu
> ps
> KONIEC
psami
psu
bashtest@host:~$

W klasach możemy podwać przedziały znaków używając myślnika. Na przykład [0-9] rozpoznaje dowolną cyfrę. Możemy podawać kilka przedziałów: [a-zA-Z] rozpoza dowolną literę angielską.

Jeśli umieścimy znak ^ na początku opisu klasy, będzie to oznaczać rozpoznawanie wszystkich znaków nie znajdujących się na liście. Na przykład [^xX] oznacza dowolny znak różny od x i X. Oczywiście możemy podawać też przedziały.

Jeśli chcemy umieścić na liście znak ], to należy go podać jako pierwszy na liście. Aby umieścić ^, to należy go umiścić w dowolnym miejscu, byle nie na początku. Wreszcie, aby umieścić -, to należy go umieścić na końcu listy.

Ponadto mamy możliwość kojarzenia dowolnego znaku oprócz znaku końca linii. Do tego służy znak specjalny . (kropka).

Powtórzenia

Znak specjalny * próbuje dopasować poprzedzający go element zero lub więcej razy w szukanym tekście. Na przykład =* dopasowuje się do ciągu znaków równości (być może ciągu pustego).

Inny przykład, wyrażenie [a-zA-Z][a-zA-Z0-9_]* reprezentuje identyfikator, tzn. niepusty łańcuch znaków zaczynający się od litery i składający się z liter, cyfr oraz znaków podkreślenia.

Pozycjonowanie

Jeśli chcemy, aby wzorzec był dopasowywany od początku linii, to wyrażenie zaczynamy znakiem ^. Jeśli chcemy, aby wzorzec był dopasowywany do końca linii, to wyrażenie kończymy znakiem $. Gdy użyjemy oba znaki, wzorzec będzie dopasowywany do całej linii.

Na przykład, żeby znaleźć linie, w których znajduje się dokładnie jedna kropka możemy użyć wyrażenia ^[^.]*\.[^.]*$. Użycie ^ na początku i $ na końcu oznacza, że zawsze będzie próba dopasowania całej linii. Następnie [^.]* Oznacza dowolny ciąg znaków nie zawierający kropki, a \. oznacza wystąpienie kropki (trzeba użyć \, bo . jest znakiem specjalnym).

Aby znaleźć linie, która zaczyna się od spacji, liczby, później kropki, a następnie spacji i dużej litery używamy wyrażenia ^ *[0-9][0-9]*\. *[A-Z]. Za pomocą tego wyrażenia zostaną znalezione na przykład

1. Wstęp
   2.Wprowadzenie
 13.   Zakończenie

a nie zostaną znalezione takie linie

1 Trafienie
 3. echo - komenda wbudowana
     4 . Punkt czwarty
   2006
^ 1. Wstęp

Znak opcjonalny

Znak specjalny ? mówi, że poprzedzający element może wystąpić, bądź też nie. Na przykład wyrażenie -?[0-9][0-9]* oznacza dowolny niepusty ciąg cyfr, być może poprzedzony znakiem -. Czyli takie wyrażenie może służyć do rozpoznawania dowolnej liczby całkowitej (jeżeli dopuścimy to, że zapis dziesiętny liczby może mieć wiodące zera).

Wyrażenia rozszerzone

Przykłady wykorzystania

grep

expr

awk

sed