Wyrażenia regularne - wprowadzenie

Wyrażenia regularne zwane potocznie regexp od angielskiego REGular EXPresion to - wedle definicji - wzorce, które opisują łańcuchy symboli. Teoria wyrażeń regularnych jest związana z teorią języków regularnych. Wyrażenia regularne mogą określać zbiór pasujących łańcuchów, mogą również wyszczególniać istotne części łańcucha. Czym są jednak w istocie wyrażenia regularne (regexp - tego skrótu będę używał), do czego się przydają i jaka korzyść z nich płynie?

Praktyka

Z praktycznego punktu widzenia regexp najczęściej wykorzystywane są do wyszukiwania lub zamiany łańcuchów w plikach. Dla przykładu: chcę w tekście wyszukać słowa regex i regexp. Pisząc artykuł używałem obu skrótów, ale teraz bardziej podoba mi się regexp. Celem moim będzie wiec zamiana regex na regexp. Ale zacznijmy od wyszukania. Do wyszukiwania (dla przykładu) wykorzystam program sed. Więcej o sed tu: http://www.continuum.com.pl/sed/sed_polecenia.html.

Szukamy linii zawierających ciąg znaków regex w pliku in.txt, czyli możemy wydać polecenie

  • sed -n -e '/regex/p' in.txt

Na konsoli zostaną wyświetlone linie zawierające zarówno 'regex', 'regexp' oraz 'regex,', 'regex.', 'regexp,', 'regexp.'. itd. To oczywiście za dużo. Miało być samo regex. Jeśli wydam polecenie:

  • sed -n -e '/ regex /p' in.txt

czyli polecenie wyszukania łańcucha spacja regex spacja, to nie zostaną wyszukane słowa regexp - to dobrze, ale pominę 'regex.' oraz 'regex,', a nie o to chodzi. Oczywiście zadanie mogę zrealizować w kilku krokach, tj. przeprowadzić wyszukiwanie 'regex', 'regex.', 'regex,' itd. Jednak wygodnie byłoby opisać poszukiwane łańcuchy jednym wzorcem. Tu właśnie pojawia się potrzeba wyrażeń regularnych.


POSIX BASIC REGEXP

Standard POSIX opisuje wyrażenia regularne. Podstawowa reguła mówi, że każdy znak reprezentuje samego siebie np. A oznacza literę A. Wyjątek od tej reguły stanowią tzw. metaznaki. Poniżej lista metaznaków i ich znaczenie.

.pojedynczy znak, ale nie znak nowej linii
C*dowolna ilość znaków C, również 0 znaków C
[...]każdy znak zawarty pomiędzy [ ]; znaki specjalne wewnątrz [ ] są traktowane dosłownie tj. '.' oznacza znak '.'; ponadto aby znak '-' był traktowany dosłownie musi być na początku lub na końcu wyrażenia [...] lub [^...], inaczej będzie oznaczał zakres znaków, np. [a-z], to każdy znak pomędzy a i z
[^...]każdy znak NIE zawarty pomiędzy [ ], lecz bez znaku nowej linii
[x-y]każdy znak z zakresu pomiędzy x i y np. [0-9] lub [a-z]
C\{n,m\}nie mniej niż n i nie więcej niż m wystąpień znaku C
^początek linii
$koniec linii
\Cznak C jest traktowany dosłownie, np. \* oznacza dosłownie *
\(pattern\)łańcuch lub dopasowanie zawarte pomiędzy \( \) jest zapamiętywany i można się do niego później odwołać poprzez \n
\nodwołanie do poprzednio zapamiętanego łańcucha lub dopasowania, np. \1 odwołuje się do pierwszego zapamiętanego dopasowania, \2 do drugiego itd.

Poza powyżej wymienionymi, jak już wspomniałem, każdy znak oznacza samego siebie np. a to a Z to Z itd.

UWAGA aby metaznak nie był znakiem specjalnym ale oznaczał samego siebie, należny go poprzedzić znakiem \. Np. '\*' oznacza '*'.

Przykłady:

'[hc]*at' pasuje do "at", "hat", "cat", "hhat", "chat", "hcat", "ccchat", itd.
'^$' oznacza pustą linie
'^regex' oznacza słowo regex na początku linii
'regex$' oznacza słowo regex na końcu linii
'regex\$' oznacza regex$ (regex i znak $)
' *regex\.' oznacza jedna lub wiele spacji, słowo regex i znak .

Cudzysłowy '' oraz ' nie są oczywiście elementem wyrażenia regularnego, dodałem je dla czytelności.

Korzystając z wyrażeń regularnych możemy teraz za pomocą jednego wzorca opisać poszukiwane przez nas łańcuchy.

  • ' *regex[,.]* '

co oznacza:

  • spacja
  • dowolna ilość spacji
  • łańcuch regex
  • ',' albo '.' w dowolnej ilości
  • spacja

Aby wydać sed polecenie wyszukania takiego ciągu znaków należy napisać:

  • sed -n -e '/ *regex[,.]* /p' in.txt

Tyle tytułem wprowadzenia do wyrażeń regularnych CDN....


Tomasz Zin

Na podstawie O'Reilly "Regular Expresion" Tony Stubblebine; August 2003, ISBN : 0-596-00415-X. Wyrażona powyżej opinia jest prywatnym poglądem autora wypowiedzi. Korzystasz na własną odpowiedzialność.