Regexpy – część 1

Jeśli czytasz tego posta, zapewne szukasz jakichś informacji o wyrażeniach regularnych. Temat jest bardziej obszerny niż zwykle się wydaje:) W tym poście znajdziesz podstawowe informacje i linki do stron o wyrażeniach regularnych, które moim zdaniem są warte uwagi.

 

Czym są wyrażenia regularne? Teoretycznie rzecz biorąc jest to ,,formalny opis języków regularnych wolnego monoidu A*”? Stąd daleko do zastosowań:) Mówiąc prościej wyrażenia regularne to przyjęty i sprawdzony sposób opisu tekstu. Przy czym tekst należy traktować jako ciąg znaków jakiegoś alfabetu (np łacińskiego, ale mogą to być np też cyfry czy tzw. znaki specjalne). Stosujemy je wtedy, gdy przygotowujemy automat poszukujący tekstu pasującego do jakiegoś wzorca, co zaskakująco często zdarza się w programowaniu lub administrowaniu systemami.

Sam  odwiedzam strony o wyrażeniach regularnych:

  1. opis klasy pattern w javie (link) - często wykorzystywana w aplikacjach przeglądarkowych napisanych w javie
  2. opis modułu re w pythonie (link) - zawiera przystępnie opisaną składnię wyrażeń regularnych, razem z bardziej zaawansowanymi konstrukcjami (lookbehind, lookahead itd).
  3. strona poświęcona wyrażeniom regularnym (link) - też zawiera dosyć szczegółowe opisy zaawansowanych konstrukcji.

 

Wyrażenia regularne są po prostu regułami dopasowania tekstu, zapisanymi jako ciąg znaków. Jak to w komputerach, można spotkać różne warianty wyrażeń regularnych, ale raczej wszystkie mają wspólne znaczenie znaków:

 

  • . (kropka) – pasująca do pojedycznego dowolnego znaku,
  • ^ – pasuje do poczatku linii
  • $ – pasuje do końca linii
  • litery alfabetu (a,b,…) – pasują do… samych siebie

 

Dysponując tym zestawem można już stworzyć prosty wzorzec. Np wyrażenie ^..$ będzie pasowało do każdej linii, w której są dokładnie dwa znaki,  ^a będzie pasowało do każdej linii zaczynającej się na a. Wreszcie, ^$ będzie pasowało do pustych linii (nie zawierających żadnych znaków). Coś już z tego można zrobić, ale i tak bardzo dokładnie musimy wiedzieć, czego szukamy (np. gdy szukamy linii zaczynających się na a lub b). Mamy więc dodatkowe elementy składni:

[...] (klamrowe nawiasy) – wyrażenie pasuje, jeśli tekst zawiera któryś ze znaków znajdujących się w nawiasie. W nawiasach możemy podac przedziały (np. 0-9 lub a-g). Możemy też wykorzystać ,,predefiniowane” grupy znaków (niestety zależne od stosowanego narzecza), np. [:upper:] w bashu pasuje do liter dużych, a s w javie/pythonie – do znaków białych (spacja, tab. itd).

[^...] (klamrowe nawiasy z caretem z przodu) – wyrażenie pasuje, jeśli tekst nie zawiera żadnego ze znaków z nawiasu,

* – wyrażenie pasuje jeśli znak poprzedzający gwiazdkę występuje 0 (!) lub więcej razy

+ – wyrażenie pasuje, jeśli znak poprzedzający plus występuje co najmniej jeden raz.

Z powyższych konstrukcji można już zrobić całkiem sporo. Na przykład wyrażenie:

^[[:blank:]]*#.*$

pozwoli nam znaleźć wszystkie linie zawierające tylko komentarz w stylu bash (zawierające ciąg znaków zaczynający się od #, co najwyżej poprzedzony pustymi znakami).

 

Na dzisiaj to już wszystko. Mam nadzieję, że powyższe informacje okażą się dla Ciebie przydatne:)