Wyrażenia regularnie

Do napisania tego posta, natchneła książka “Wyrażenia regularne” autorstwa Jeffrey E. F. Friedl wydawnictwa Helion nr ISBN: 83-7197-351-9, Cena: 55.00 zł.

Wracając to rzeczy

Czym są wyrażenia regularne?

Można powiedzieć, że mały język programowania dołączany do innego języka programowania, otóż z wyrażeń regularnych korzysta m.in Python, Perl i wiele wiele innych.

Wyrażenia regularne służą do przetwarzania tekstów, piszemy wzorzec wg którego będą znajdowane wyniki w teksie a następnie (jeżeli chcemy) zostanie zmieniony.

Wyrażenia regularne na angielski to Regular Expresions skrótowo regexp

Jest w tym haczyk?

Jest, ponieważ wyrażenia mają wiele odmian, dialektów. Dlatego wzorzec pasujący w perlu nie będzie pasował w grepie.

Jak to wygląda

Przedstawię wyrażenia regularne na podstawie Perla, oraz grepa
Wzorce będę umieszczał w  ukośnikach “/…/”

Zestaw którym musimy opisać wzorzec nie jest olbrzymi ale wystarczy aby stworzyć prawie każdy wzorzec.

  • * - Poprzedzającego znaku ma być 0 lub więcej razy.
  • + - Poprzedzającego znaku ma być 1 lub więcej razy.
  • ? - Poprzedzający znak jest opcjonalny.
  • | - Alternacja (wzorzec LUB inny_wzorzec).
  • . - (kropka) Zastępuje dowolny znak.
  • ^ - Początek wiersza.
  • $ - Koniec wiersza.
  • () - Grupują symbole.
  • [] - Klasa znaków.


Znaki specjalne występujące w Perlu

  • \d - Dowolna cyfra (JEDNA!)
  • \D - Wszystko inne niż cyfra
  • \s - Znaki ‘białe’
  • \S - Wszystko inne niż znaki białe
  • \w - Dowolna litera
  • \W - Wszystko inne niż litera
  • \b - Granica słowa

$1..$9 - Odwołania wsteczne, do tych zmiennych zostają wprowadzone dopasowania z nawiasów.

Napiszmy wyrażenia regularne

Załóżmy, że widzimy jakiś teleturniej słowny w języku angielskim i chcemy błysnąć inteligencją oraz znajomością języka obcego.

Jest podany wyraz 6 literowy z literkami t**a**.
Więc nasz regexp będzie wyglądał tak: /^t..a..$/
A polecenie w konsoli tak : grep “^t..a..$” /usr/share/dict/american

Ten regexp nie jest skomplikowany, może dziwić obecność ‘^’ oraz ‘$’, a usuń je… i zobaczysz, że słów jest więcej, ponieważ grep zaczął szukać wzorca również w wyrazach NIE zaczynających się od ‘t’.

Kolejny przykład:
Miałem problem, ponieważ pisałem często słowo ’super’ z dwoma lub więcej ‘r’. Chcąc się ich pozmyć uruchomiłem w ‘Kate’ opcję ‘znajdź i zastąp’ wpisując odpowiedniego regexpa:
/super+/ zastąp na ’super’. I tyle.

Ten przykład jest ściągnięty z książki którą na samym początku wymieniłem.
posiadamy w zmiennej $cena, cenę pewnego produktu, chcemy aby była zwracana w postaci dwóch miejsc po przecinku, ale gdy trzecią cyfrą po przecinku jest cyfra inna niż zero, wtedy ma być zwrócona.
Przykład: 37.500 -> 37.50, 12.3753821 -> 12.375

Polecenie wyglądać będzie tak $cena =~ s/(\.\d\d[1-9]?)\d*/$1/

Zagmatwane?…

Funkcja s/…/…/ wygląda i działa jak sed
‘\.’ mówi nam że w tym miejscu ma być kropka na NIE znak określający dowolny znak
‘\d\d’ mówi mam że mają być dwie cyfry z zakresu [0-9]
‘[1-9]?’ następnie jest cyfra zakresu 1-9 która jest opcjonalne, nie musi jej być

‘\d*’ oznacza resztę cyfr których może być od 0 do nieskoczości

‘$1′ mówi nam, że do zmienej $cena ma zwrócić zawartość nawiasów.

Koniec?

To nie koniec, wrócę jeszcze do tematyki wyrażeń regularnych.

Leave a Reply