Wprowadzenie do wyrażeń regularnych
- Autor: Mirosław Zalewski
- 9 lipca 2013
- komentarze 3
Silnik wyrażeń regularnych jest jednym z najpotężniejszych narzędzi, w jakie wyposażony został pakiet LibreOffice. W artykule znajduje się wszystko, co musisz wiedzieć, aby zacząć z niego korzystać.
Spis treści
Czym są wyrażenia regularne?
Na potrzeby niniejszego artykułu przyjmiemy, iż wyrażenia regularne to specjalne symbole umożliwiające odnalezienie różnych (odmiennych) fragmentów tekstu za pomocą jednego tylko zapytania.
Bardziej dociekliwi czytelnicy powinni wiedzieć, iż takie postawienie sprawy jest pewnym uproszczeniem. W rzeczywistości zwrotu „wyrażenia regularne” powszechnie używa się na określenie zarówno samych znaczników, konkretnej frazy je zawierającej, jak i funkcji wbudowanej w program; zazwyczaj dokładne znaczenie wynika wprost z kontekstu zdania, w którym zwrot ten występuje.
Dla celów praktycznych wystarczy zapamiętać, że gdy mowa o wyrażeniach regularnych, to chodzi o bardzo wszechstronny sposób poszukiwania fragmentów tekstu.
Dlaczego warto używać wyrażeń regularnych?
Najważniejsze powody są dwa.
Po pierwsze, umożliwiają odnalezienie w tekście fragmentów różnych, ale posiadających pewne wspólne cechy. Możemy np. przejrzeć jedynie te zwroty ujęte w cudzysłów, po których nie występuje przypis bibliograficzny.
Po drugie, pozwalają masowo zamieniać jedynie część odnalezionej frazy. Sztandarowym przykładem jest umieszczanie niełamliwej spacji za tzw. sierotkami, czyli jednoliterowymi wyrazami (i, z, w itp.).
Ogólnie rzecz ujmując, wyrażenia regularne przyśpieszają pracę oraz gwarantują otrzymanie spójnych wyników i mniejszą liczbę pomyłek. Są więc niezbędnym elementem wyposażenia każdego, komu zależy na biegłości w tworzeniu i edytowaniu dokumentów.
Jak włączyć obsługę wyrażeń regularnych?
Aby móc używać wyrażeń regularnych podczas przeszukiwania dokumentu, musimy otworzyć okno Znajdź i zamień (Edycja → Znajdź i zamień... lub skrót klawiaturowy Ctrl + H), wcisnąć Więcej opcji i zaznaczyć pole wyboru Wyrażenie regularne.
Wyrażeń regularnych możemy także używać w niektórych formułach tekstowych programu Calc. Aby włączyć ich obsługę, otwieramy opcje pakietu (Narzędzia → Opcje...) i w drzewku LibreOffice Calc wybieramy Oblicz. Następnie zaznaczamy pole Włącz wyrażenia regularne w formułach.
Niektóre symbole wyrażeń regularnych
Czas najwyższy przejść do tego, co tygryski lubią najbardziej, czyli samych wyrażeń regularnych.
Lista podstawowych symboli znajduje się poniżej. Nie jest ona wyczerpująca — pominąłem zarówno symbole rzadziej używane (na razie nie warto zaprzątać sobie nimi głowy), jak i bardziej zaawansowane (zasługują one na osobne artykuły). Pełny wykaz symboli oraz ich opis (w języku angielskim) znajduje się na stronie projektu ICU.
Uwaga! Poniższa lista odnosi się do LibreOffice 4.0 i nowszych. Wcześniejsze wersje pakietu dysponowały autorskim, znacznie mniej rozbudowanym silnikiem wyrażeń regularnych. Wykaz obsługiwanych przez niego symboli i ich opis znajduje się w pomocy programu.
Symbole dopasowania
Są to podstawowe symbole, które zastępują jeden lub kilka znaków.
Symbol | Znaczenie |
---|---|
. (kropka) |
Dowolny znak. |
\w |
Znak występujący w słowach (wszystkie litery, cyfry, podkreślenie (_)). |
\d |
Cyfra (0-9). |
\s |
Znak niedrukowalny (różne rodzaje spacji, tabulator i twardy podział wiersza (Shift + Enter)). |
\t |
Tabulator. |
\n |
Twardy podział strony (Shift + Enter). |
\uHHHH |
Znak o numerze HHHH w standardzie Unicode (np. „a” to \u0061). |
\x{HHHH} |
Znak o numerze HHHH w standardzie Unicode, z możliwością pominięcia początkowych zer. |
\uHHHH a \x{HHHH} |
Różnica między tymi dwoma sposobami zapisu jest dość subtelna. Pierwszy z nich wymaga dokładnie czterech cyfr, podczas gdy drugi przyjmuje od dwóch do sześciu cyfr. Innymi słowy, drugi dopuszcza pominięcie początkowych zer. Literę „a” można zapisać jako \u0061, \x{61} lub \x{0061}. |
\b |
Pozycja pomiędzy znakiem „słownym” a „niesłownym”. |
^ (kareta, „daszek”) |
Pozycja początku akapitu. |
$ (dolar) |
Pozycja końca akapitu. |
\ (odwrócony ukośnik) |
Znak cytowania. Powoduje, iż następujący po nim symbol wyrażenia regularnego utraci swoje specjalne znaczenie. |
Zakresy
Określają zbiór znaków, z których dowolny (ale tylko jeden) może wystąpić na danej pozycji. Niektóre z nich mają swoje skrócone odpowiedniki na liście symboli dopasowania.
Symbol | Znaczenie |
---|---|
[abc] |
Dowolny ze znaków ujętych w nawias (w tym przypadku: a lub b lub c). |
[^abc] |
Negacja zakresu; cokolwiek, oprócz znaków ujętych w nawias. |
[a-z] |
Dowolny ze znaków pomiędzy symbolami granicznymi, wraz z nimi. Decyduje kolejność znaków w standardzie Unicode (wbrew naszej intuicji, [a-ż] zawiera symbol ®, ale nie zawiera ǎ). |
[[:alnum:]] |
Dowolna litera lub cyfra. |
[[:alpha:]] |
Dowolna litera. |
[[:digit:]] |
Dowolna cyfra. |
[[:punct:]] |
Dowolny znak interpunkcyjny lub jeden z wybranych innych symboli (np. nawiasy klamrowe, ale już nie znak dodawania). |
[[:graph:]] |
Dowolny znak drukowalny (wszystko oprócz odstępów). |
[[:space:]] |
Dowolny znak niedrukowalny (odstęp). |
Grupowanie i odwołania wsteczne
Zgrupowanie fragmentu jest konieczne do wykorzystania niektórych funkcji opisanych poniżej (np. alternatywy w ramach wyrazu). Szczegółowo zajmiemy się tym w następnym artykule.
Przy pomocy odwołania wstecznego możemy odnaleźć lub wstawić wcześniej zgrupowany fragment tekstu. Chociaż brzmi to niepozornie, jest to jedna z najpotężniejszych funkcji wyrażeń regularnych. Usuwanie powtórzeń z treści dokumentu jest tylko dość banalnym przykładem możliwości, które się dzięki temu przed nami otwierają.
Symbol | Znaczenie |
---|---|
() (nawiasy zwyczajne) |
Przechwytujące grupowanie fragmentu dopasowanego wyrażenia. |
(?:) |
Nieprzechwytujące grupowanie fragmentu dopasowanego wyrażenia. |
\N |
Odwołanie wsteczne do N-tego przechwyconego zgrupowanego fragmentu; działa tylko w polu Szukaj. |
$N |
Odwołanie wsteczne do N-tego przechwyconego zgrupowanego fragmentu; działa tylko w polu Zamień na. |
Modyfikatory liczby dopasowań
Symbole te same w sobie nic nie zastępują, ale wpływają na zakres dopasowania wyrażenia przed nimi.
Symbol | Znaczenie |
---|---|
* (asterysk, „gwiazdka”) |
Zero lub więcej razy; dowolną liczbę razy. |
+ (znak dodawania) |
Jeden lub więcej razy. |
? (znak zapytania) |
Zero lub jeden raz. |
{n} |
Dokładnie n razy. |
{n,} |
n lub więcej razy. |
{n,m} |
Więcej niż n, ale mniej niż m razy (włącznie). |
Znak alternatywy
Pionowa kreska (|) jest znakiem alternatywy. Dzięki temu dwa wyrażenia połączone zostają spójnikiem ALBO.
Dla przykładu, wyrażenie regularne kota|psa|żółwia
zastępuje wyraz „kota”, „psa” lub „żółwia”. O znaku alternatywy można więc myśleć jak o zakresie dla wyrażeń złożonych z więcej niż jednego znaku.
Wykorzystując zgrupowanie, ograniczyć możemy zakres obowiązywania alternatywy. Przypuśćmy, że chcemy znaleźć wyraz „telefon” lub „telewizor”. Wyrażenie regularne telefon|wizor
nie spełni naszych oczekiwań, gdyż oznacza „»telefon« lub »wizor«”. Odpowiednie natomiast będzie wyrażenie tele(fon|wizor)
.
Najważniejsze koncepcje
Podsumowując powyższą tabelę, podczas pracy z wyrażeniami regularnymi trzeba pamiętać o kilku kwestiach.
Raz, nie wszystkie symbole zastępują wpisane znaki. Należą do nich \b
, ^
czy $
, które teoretycznie występują w tekście, ale sami ich nie wprowadzamy.
Dwa, w trybie wyszukiwania przy pomocy wyrażeń regularnych wszystkie podane w tabeli symbole mają specjalne znaczenie. Tymczasem niektóre z nich bywają stosowane w zwykłym tekście, co może prowadzić do niezamierzonych efektów. Aby im zapobiec, wyrażenia regularne należy zacytować (ang. escape), czyli poprzedzić znakiem odwróconego ukośnika (\); np. aby znaleźć pojedynczy znak zapytania, należy użyć wyrażenia \?
.
Trzy, wszystkie podane powyżej modyfikatory liczby dopasowań są zachłanne (ang. greedy). Oznacza to, że obejmą swoim zasięgiem tak dużo znaków, jak to tylko możliwe. Dla przykładu weźmy tekst „tak” albo „nie”. Wyrażenie regularne „.*”
obejmie go w całości.
Aby włączyć dopasowanie niezachłanne (ang. non-greedy), należy umieścić znak zapytania po modyfikatorze liczby dopasowań. W przypadku powyższego tekstu wyrażenie regularne „.*?”
obejmie fragmenty „tak” oraz „nie”.
Przykłady
Drugi artykuł wprowadzający w wyrażenia regularne zawiera ich przykłady wraz z opisem działania.
Dodatkowo na blogu działa kategoria Wyrażenia regularne. Gromadzi ona artykuły omawiające poszczególne przypadki zastosowania tej funkcji programu.
Zakończenie
Wyrażenia regularne są potężnym narzędziem, dzięki któremu możemy tworzyć dokumenty szybciej i wygodniej, zaś efekty będą bardziej spójne i pozbawione większości błędów. Z tych powodów warto poświęcić czas na opanowanie przynajmniej podstaw pracy z nimi.
Pomóc w tym mogą dwie niezwykle przydate strony internetowe. RegExr pozwala sprawdzić działanie dowolnego wyrażenia regularnego na wybranym tekście. Natychmiast podświetla dopasowane fragmenty oraz pokazuje zawartość kolejnych grup (o ile są obecne). Regular-Expressions.info stanowi wyczerpujący zbiór informacji o wyrażeniach regularnych i różnych ich implementacjach; niestety, korzystanie z niego wymaga znajomości języka angielskiego.
Dzień dobry,
Bardzo ciekawy artykuł. Długo szukałam podstawowych wiadomości na temat wyrażeń regularnych. Zajmuję się narzędziami CAT w pracy tłumacza i polecam artykuł.
Pozdrawiam,
Izabela M
Witam
Jak wyszukać i zamienić | (pionowa kreska) w calcu na ‚ ?
Nie chce mi tego w ogóle odnajdywać.
jak zamienić więcej niż dwa entery (to chyba znak $) na maksymalnie dwa entery?