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


10.06.2019

Inteligentne zarządzanie...

W dniach 11, 12 i 13 czerwca – odpowiednio – w Gdańsku, w Warszawie i w Katowicach,...
27.05.2019

Rozwiązania na platformie GCP

Citrix SD-WAN i Citrix ADC
27.05.2019

Chmura hybrydowa

Dell Technologies Cloud
27.05.2019

Uproszczona komunikacja

Cisco Webex
24.05.2019

Konferencja IT Manager of...

W dniach 12–14 czerwca w Sopocie odbędzie się konferencja IT Manager of Tomorrow 2019. To...
24.05.2019

Ochrona sieci

Fortinet FortiOS 6.2
24.05.2019

Mniejsza złożoność

Rittal VX25 Ri4Power
24.05.2019

All-in-one NAS

QNAP TDS-16489U R2
24.05.2019

Układy SoC

AMD Ryzen Embedded R1000

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"