Wyrażenia regularne są podstawą konstrukcji systemu Unix i Linux a także wielu języków programowania takich jak „awk”, „Perl” czy „PHP”. Dlatego też warto się z nimi zaznajomić gdyż wbrew pozorom ich opanowanie nie jest zbyt trudne. Przedstawię tzw. podstawowe symbole wyrażenia regularne (BRE- Basic Regular Expression) oraz rozszerzone wyrażenia regularne (ERE- extender Regular Expressions).
Odkrycie wyrażeń regularnych związane jest z pierwszymi teoretycznymi pracami nad opisowymi językami symbolicznymi prowadzonymi przez matematyka Stephen Kleene (1909-1994). Sformułował on pierwszy założenia umożliwiające zdefiniowanie tzw. zbiorów regularnych, wykorzystanych początkowo do przekazywania w sieciach neuronów informacji, a następnie zastosowanych do budowy kompilatorów. Trzeba jednak podkreślić, że wyrażenia regularne mają zastosowanie także poza informatyką; stosuje się je w lingwistyce do tzw. analizy tekstowej oraz do definiowania praw w gramatyce teoretycznej; w biologii do odszyfrowania sekwencji ludzkiego genomu, w neurologii; w elektronice do modelizacji obwodów elektrycznych itd. Interdyscyplinarny aspekt wyrażeń regularnych jest szczególnie ważny w procesie nauczania. Spróbujmy odpowiedzieć na pytanie: dlaczego praktyczne poznanie wyrażeń regularnych jest tak ważne nie tylko dla informatyków, ale także np. dla tych, którzy zajmują się przerabianiem, wyszukiwaniem - w Internecie - informacji? Aby przybliżyć czytelnikowi problem przedstawiony w tym rozdziale wyobraźmy sobie następującą sytuacje: jakiś autor zredagował tekst, którego kolejne rozdziały ponumerował w następujący sposób:
1-1, 1-2, 1-3, itd.
i chce następnie zmienić formę ich numeracji na:
§ 1.1, § 1.2, § 1.3.
Wyszukanie i zmienienie nazw rozdziałów wymaga przejrzenia całego tekstu co wiąże się z utratą sporej ilości czasu i zmęczeniem, a więc możliwością popełnienia błędu. Wyrażenia regularne – czasami nazywane wyrażeniami racjonalnymi – dostarczają nam reguł, które umożliwiają zdefiniowanie symboliczne tego czego szukamy, w tym wypadku liczby po której następuje myślnik po którym znów następuje liczba. Wyrażenie typu:
1-1, 1-2, 1-3, itd.
jest wyrażeniem znakowym (lub literalnym) . Natomiast wyrażenie typu \d-\d jest opisem abstrakcyjnym w/w wyrażeń znakowych, \d jest konwencją używaną w wyrażeniach regularnych do oznaczenia zbioru liczb całkowitych 0-9. Jednak jeśli numer rozdziału będzie większy od 9 np. 10-1 lub 1-10 to wyrażenie regularne \d-\d go nie odnajdzie, dlatego też musimy je uogólnić na wszystkie liczby całkowite. W tym celu po literze d dorzucamy znak + , który oznacza "wyszukaj jedną lub wiele liczb zawartych w zbiorze 0-9" , otrzymujemy zapis:
\d+-\d+
spełniający wymogi naszego uogólnienia. Tak więc w przeciwieństwie do ciągu literalnego typu 1-1, 100, abcd, FBR, wyrażenia regularne mogą w sposób abstrakcyjny przedstawić dowolny ciąg znaków. Oto kilka typowych sytuacji w których symbole wyrażeń regularnych są często używane:
- wyszukanie określonego ciągu znaków – np. w tekście dotyczącym chemii organicznej odnalezienie wszystkich terminów zaczynających się przedrostkiem ortho lub w spisie plików znalezienie tych, które kończą się na .doc
- zmiana tekstu w stronice Internetową
- zmiana w tekście formy pewnych słów np. dużo-literowych na mało-literowe lub odwrotnie
- analiza prawomocności wartości przekazanej: np. oczekujemy, że użytkownik wystuka na klawiaturze adres elektroniczny lub liczbę o szczególnej formie: wyrażenie regularne umożliwi wykrycie błędu
- przeformowanie ustrukturalizowanego tekstu: np. bibliograficzna baza danych przedstawiona jest w formie, którą chcemy zmienić umiejscawiając datę publikacji po nazwisku autora a nie po tytule jak było dotychczas.
Przedstawię teraz tzw. podstawowe symbole wyrażenia regularne (BRE , Basic Regular Expression)
. → kropka: odpowiada dowolnemu pojedynczemu znakowi z wyjątkiem znaku przedstawiającego koniec linii – np. wyrażenie regularne b.l przedstawia zarówno słowo bal jak bol jak i każdą inną kombinacje typu bel, bil, bpl, etc
[ ] → pozwala dopasować dowolny znak ze zbioru zawartego między nawiasami, wszystkie znaki występujące między nawiasami mają zwykłe znaczenie oprócz myślnika - , który jest używany do tworzenia zakresu znaków n.p [a-z] oznacza każdą małą literę alfabetu. Znak ^ , który umiejscowiony na początku nawiasów [^ ] wyznacza negacje zbioru zdefiniowanego między nawiasami n.p [^0-9] oznacza wszystkie znaki oprócz 0,1,2,3,4,5,6,7,8,9 etc
* → gwiazdka dopasowuje zero lub więcej wystąpień znaków poprzedzających *. Zwracamy uwagę, że gwiazdka w wyrażeniach regularnych ma inne znaczenie niż gwiazdka w generowaniu nazwy plików, w tym przypadku * oznacza dowolnie długi – także pusty – ciąg różnych znaków. W wyrażeniach regularnych dowolny ciąg dowolnych znaków zapisujemy jako .*
^ → akcent w formie daszka wskazuje, że ciąg znaków występujący po nim znajduje się na początku linii.
$ → dolar jest przeciwieństwem ^ i wskazuje, że ciąg znaków, który go bezpośrednio poprzedza znajduje się na końcu wiersza
\ → neutralizuje znaczenie znaku specjalnego np. \$ będzie oznaczał znak dolara $ a nie znak wyrażenia regularnego wskazującego, że ciąg znaków go poprzedzający znajduje się na końcu wiersza
[^ ] → dopasowuje dowolny znak, który nie znajduje się w nawiasach. Znak ^ działa jak operator dopełnienia dla zbioru lub klasy znaków. Na przykład [^0-9] oznacza wszystkie znaki, które nie są cyframi
\\ → puste wyrażenie regularne, które przyjmuje wartość ostatniego wyrażenia regularnego
\ ( wyrażenie regularne\) →
Wyrażenia Regularne Darmowy kurs Linux