Strona korzysta z plików cookies w celu realizacji usług i zgodnie z Polityką Plików Cookies.


19.03.2019

Pożegnanie z systemem Windows...

System operacyjny Windows 7 wciąż cieszy się dużą popularnością wśród użytkowników...
21.02.2019

Wdrażanie projektów AI

Infrastruktura OVH
21.02.2019

Certyfikacja kluczy

HEUTHES-CAK
21.02.2019

Kopie zapasowe

Veeam Availability for AWS
21.02.2019

Dysk SSD Samsung 970 EVO Plus

Dysk SSD Samsung 970 EVO Plus
21.02.2019

Szyfrowane USB

Kingston IronKey D300 Serialized
21.02.2019

Bezpieczeństwo sieci

Check Point Maestro i seria 6000
21.02.2019

Ochrona danych

Commvault IntelliSnap i ScaleProtect
21.02.2019

Ułatwienie telekonferencji

Plantronics Calisto 3200 i 5200

Wyrażenia regularne – praktyczne i uniwersalne

Data publikacji: 26-09-2018 Autor: Grzegorz Kuczyński

Wyrażenia regularne to narzędzie, które może usprawnić pracę zarówno administratora, jak i programisty. Pierwotnie używane były w systemie Unix, obecnie niemal każde rozbudowane narzędzie oferuje ich obsługę niezależnie od platformy systemowej. Ci, którzy już używają wyrażeń regularnych, zazwyczaj nie wyobrażają sobie bez nich pracy.

 

Wyrażenia regularne nie są zbyt popularne, ale w wielu przypadkach ich użycie znacznie ułatwia rozwiązanie problemów. W artykule omawiamy same wyrażenia regularne oraz przykłady ich użycia. Najprościej rzecz ujmując, wyrażenia regularne służą do dopasowywania ciągów tekstowych. Niemal każdy spotkał się z takimi metaznakami jak * czy ?, które występowały już w systemie MS-DOS. Użyto ich w wierszu poleceń, ponieważ były bardzo użyteczne i usprawniały posługiwanie się nim. Wyrażenia regularne mają o wiele większe możliwości – pozwalają dopasowywać złożone ciągi znaków, a przy współpracy z innymi narzędziami nawet je modyfikować.


> PODSTAWOWE NARZĘDZIA


Najczęściej z wyrażeń regularnych będziemy mogli korzystać w systemie oferującym wiele tekstowych poleceń. Dlatego przykłady omawiane w tym tekście będą wykonywane w systemie Linux. Oczywiście wyrażenia regularne są również wykorzystywane w graficznych narzędziach (do tej grupy można zaliczyć np. edytory tekstowe). Jednak najczęściej są one używane do pracy w powłoce (np. bash), podczas konfiguracji niektórych usług, bądź podczas przetwarzania różnego rodzaju tekstów. Wyrażenia regularne są też dostępne niemal w każdym języku programowania, zazwyczaj w postaci oddzielnej biblioteki.

 

Systemy typu Unix oferują bogaty zestaw narzędzi obsługujący wyrażenia regularne. Najpopularniejsze z nich to grep i sed. Narzędzia grep używał zapewne każdy użytkownik systemu Linux, jednak nie wszyscy wiedzą, że już sama jego nazwa wywodzi się od polecenia g/re/p w edytorze ed (od global/ regular expression/print). Z kolei sed jest strumieniowym edytorem tekstowym, który bazuje głównie na wyrażeniach regularnych oraz na licznych własnych rozszerzeniach. Najprościej rzecz ujmując, sed pozwala w zaprogramowany sposób edytować pliki tekstowe lub strumienie.


> PROSTE DOPASOWANIA


Załóżmy, że chcemy sprawdzić format numeru telefonu, który został wprowadzony w formularzu udostępnionym na stronie internetowej. Możemy stworzyć wyrażenie, które na kilka sposobów będzie dopasowywać przykładowy format numeru telefonu. Pierwszym z nich jest użycie skrótu \d oznaczającego dowolną cyfrę.


\d\d\d-\d\d\d-\d\d\d


Powyższy wzorzec, mimo że czytelny, musi mieć taką samą długość jak docelowy ciąg, co w przypadku dłuższych ciągów znaków może być problemem. Dlatego użyjemy tu kwantyfikatora {} określającego liczbę dopasowań poprzedniego znaku:


 \d{3}-\d{3}-\d{3}


Poprawność naszego wyrażenia można sprawdzić chociażby za pomocą wspomnianego polecenia grep:


$ echo "123-456-789" | grep -P "\d{3}-\d{3}-\d{3}"
123-456-789


Jednak do nauki polecamy korzystanie z takich stron jak np. regex101.com, które pozwalają zarówno diagnozować, jak i konstruować wyrażenia złożone. Innym sposobem na dopasowanie cyfr są klasy znaków []. Możemy umieszczać w nich nie tylko określone znaki, ale również ich zakresy. Na przykład zapis [0-9] oznacza jedną dowolną cyfrę. Możemy więc użyć w wyrażeniu klas, osiągając ten sam efekt:


[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9]
[0-9]{3}-[0-9]{3}-[0-9]{3}


> GRANICE


To, w jaki sposób skonstruujemy wyrażenie, często zależy od efektu, jaki chcemy osiągnąć. Jeżeli chcielibyśmy tylko znaleźć w tekście ciąg pasujący do numeru telefonu, to dotychczasowe przykłady mogłyby wystarczyć. Jednak w przypadku walidacji, której celem jest wymuszenie użycia określonej składni, wyrażenie musi być dokładniejsze. Dla przykładu poniższe wyrażenie przepuści nie do końca oczekiwany tekst:


$ echo "https://1.1.1.1/index.php?a=123-456-789" | grep -P "\d{3}-\d{3}-\d{3}"

https://1.1.1.1/index.php?a=123-456-789


Dzieje się tak, ponieważ szukamy numeru, ale nie zaznaczamy, że ani przed nim, ani za nim nie powinno być nic innego. Problem można rozwiązać za pomocą tzw. granic. Najpopularniejszymi z nich są początek ^ i koniec $ wiersza. Po wprowadzeniu zmian nasze wyrażenie będzie wyglądać następująco i nie będzie mieć prezentowanej powyżej wady:


^\d{3}-\d{3}-\d{3}$


Popularna jest również granica dla słów, której początek i koniec oznaczane są skrótem \b.

[…]

Autor zawodowo zajmuje się informatyką. Jest członkiem społeczności open source, prowadzi blog nt. systemu GNU/Linux.

Artykuł pochodzi z miesięcznika: IT Professional

Pełna treść artykułu jest dostępna w papierowym wydaniu pisma.

.

Transmisje online zapewnia: StreamOnline

All rights reserved © 2019 Presscom / Miesięcznik "IT Professional"