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



31.12.2020

Cykl webinarów

weinnovators.club
30.12.2020

Integracja z Teams

Veeam Backup
30.12.2020

Namierzanie zagrożeń

Flowmon Networks i Fortinet
30.12.2020

Wsparcie dla przedsiębiorstw

VMware Cloud on AWS
29.12.2020

Nowe NAS-y Thunderbolt 3

QNAP QuTS TVS-h1288X i TVS-h1688X
29.12.2020

Modele kompaktowe

VPL-PHZ60 i VPL-PHZ50
28.12.2020

Dedykowane przemysłowi

Seria TJ
28.12.2020

Nowa generacja

Router QHora-301W

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.

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

prenumerata Numer niedostępny Spis treści

.

Transmisje online zapewnia: StreamOnline

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