/WyrażeniaRegularne

Z Brain-wiki

TI:WTBD/WyrażeniaRegularne

Wyrażenia regularne (RE, RegEx, RegExp) to składnia budowy wzorców, definiujących klasy pasujących napisów. Implementacja polega na bibliotece funkcji/klas, które interpretują te wzorce i stosują je do określania operacji, jakie mają być wykonane na napisach.

Wyrażenia regularne pozwalają często uniknąć żmudnego analizowania napisów znak po znaku, ale nie są uniwersalnym narzędziem do analizy formatów tekstowych -- tylko raczej szczeblem pośrednim pomiędzy analizą danych tekstowych kodem ad hoc, a wykorzystaniem wyspecjalizowanych parserów. W szczególności, nie wystarczają one do analizy złożonych formatów czy języków (języki programowania, XML, ...).

Istnieje kilka nieco różniących się implementacji wyrażeń regularnych:

  • POSIX / GNU (grep, sed, awk)
  • Perl (PCRE)
  • Python
  • Javascript
  • ...

Podstawowa składnia (rozszerzona, w terminach POSIX)

  • są znaki zwykłe, i metaznaki
  • metaznaki to:
. ^ $ * + ? { } [ ] \ | ( )
  • znaki zwykłe to cała reszta
  • znaki zwykłe oznaczają same siebie, metaznaki -- operatory, grupowania, elementy wymienne
  • \ stosuje się do wyłączenia interpretacji następującego po nim metaznaku
  • pojedynczy znak jest regexpem
  • elementy wymienne to też regexpy:
    • . -- dowolny pojedynczy znak
    • [rjb] -- zestaw: dowolny 1 z wymienionych
    • [a-k] -- zakres
    • [[:alpha:]] -- klasa nazwana, np. tu: dowolna z liter (jest ich kilka)
    • [^...] -- dopełnienie zestawu, zakresu, klasy
  • operatory to:
    • sklejanie (gdy piszemy jeden regexp za drugim)
    • zwielokrotnianie -- operatory postfixowe:
      • * -- dowolna wielokrotność (w tym -zero)
      • + -- krotność co najmniej 1
      • ? -- krotność 0 lub 1
      • {n,m} -- krotność od n do m włącznie; każdą z tych liczb można pominąć nie określając dolnego czy odp. górnego ograniczenia
      • {n} -- krotność dokładnie n
    • alternatywa: do A|B pasuje suma tego co pasuje do A i tego co do B.
  • kolejność operacji to: zwielokrotnianie, sklejanie, alternatywa
  • do grupowania -- narzucenia łączności operacji można użyć nawiasów okrągłych
  • nawiasy okrągłe definiują również referencje wsteczne:
    • \n oznacza kolejne wystąpienie w odp. miejscu podnapisu, który pasował do n-tej grupy w nawiasach (w składni Posix n < 10)
  • ^ $ oznaczają odpowiednio początek i koniec napisu (linii w przypadku grep).

Taka składnia obowiązuje w egrep (grep -E) i awk. Zwykły grep nie rozpoznaje

? + { | ( )

jako metaznaków, tylko odwrotnie -- interpretuje je, jeśli poprzedzone znakiem \ (zaszłość historyczna).

Przykłady wyrażeń regularnych

grep

  • Domyślnie: przetwarza strumień tekstowy jako ciąg linijek
  • Dla każdej linijki ustala czy zawiera ona podnapis pasujący do zadanego argumentem wyr. regularnego
  • jeśli tak: wypisuje linijkę, jeśli nie: pomija
  • często używane opcje:
    • -E -- włącza składnię ,,rozszerzoną", p. uwaga powyżej
    • -v -- dopełnienie: przepuszcza linie nie pasujące
    • -i -- utożsamia małe i wielkie litery
    • -r -- działa rekursywnie: jeśli któryś z argumentów jest katalogiem, to przegląda również jego zawartość
    • -e -- argument tej opcji jest wzorcem (a nie np. kolejną opcją)
    • -x -- żada dokładnego dopasowania całości linii
    • -q -- nic nie pisać, tylko ustawić kod powrotu: 0 - znaleziono dopasowanie, !=0 - nie znaleziono
    • -h -- pominąć nazwy plików w outpucie