Regular expression

Formalny język wzorców służący do dopasowywania i wyszukiwania tekstu. Wykorzystywany przez narzędzia takie jak grep, sed czy awk.

Wyrażenie regularne (ang. regular expression, w skrócie regex albo regexp) to formalny język wzorców, którym opisujesz, jak ma wyglądać szukany fragment tekstu. Zamiast literalnie wpisywać konkretne słowo, definiujesz regułę: „ciąg cyfr”, „adres e-mail”, „linia zaczynająca się od ERROR„. Silnik regexa bierze ten wzorzec i sprawdza, czy (i gdzie) pasuje do podanego tekstu. To jeden z tych skilli, które wyglądają jak magiczne zaklęcia, a po opanowaniu oszczędzają godziny ręcznego grzebania w plikach.

Jak to działa

Wzorzec budujesz z dwóch rodzajów znaków: zwykłych (literał a pasuje do litery „a”) oraz metaznaków, które mają specjalne znaczenie. Najczęściej używane to . (dowolny znak), * (zero lub więcej powtórzeń), + (jedno lub więcej), ? (zero lub jeden), ^ i $ (początek i koniec linii), [abc] (jeden ze znaków z klasy) oraz \d, \w, \s (cyfra, znak słowa, biały znak). Z tych klocków składasz dowolnie złożone reguły.

Warto wiedzieć, że „regex” to nie jeden standard. Istnieje kilka dialektów: POSIX BRE i ERE (tego używają klasyczne narzędzia uniksowe) oraz PCRE (Perl Compatible Regular Expressions), które znasz z Pythona, JavaScriptu czy PHP. Różnią się drobiazgami, np. tym, czy + trzeba poprzedzać backslashem. Dlatego wzorzec działający w jednym narzędziu nie zawsze zadziała w drugim bez przeróbki.

Przykład z praktyki

Klasyczny scenarios: szukasz w logach serwera wszystkich adresów IP. W terminalu Linuksa odpalasz grep z flagą rozszerzonych wyrażeń:

grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' access.log

Chcesz podmienić tekst? sed robi to w locie: sed -E 's/błąd/error/g' plik.txt zamienia każde wystąpienie. A awk potrafi filtrować całe wiersze pasujące do wzorca. Te trzy narzędzia plus regex to podstawowy zestaw do obróbki tekstu w terminalu.

Na co uważać

Najczęstszy mit: „wyrażeniem regularnym sparsuję HTML”. Nie rób tego, HTML jest zbyt zagnieżdżony, a regex tego nie obejmie poprawnie. Druga pułapka to tzw. catastrophic backtracking, czyli wzorzec, który na złośliwym wejściu potrafi zawiesić proces na minuty. Pamiętaj też, że .* jest greedy, łapie najwięcej jak się da, więc często chcesz wersji leniwej .*?. I sprawdzaj, w jakim dialekcie pracujesz, zanim zaczniesz przeklinać, że wzorzec nie działa.

Pojęcia powiązane: grep, sed, awk, PCRE, POSIX, parsowanie tekstu, glob (które bywa mylone z regexem, choć to inny mechanizm dopasowywania nazw plików).