Regulárne výrazy

Porovnanie :: Perl | Python

Regulárne výrazy slúžia na spracovanie textových reťazcov. Pomocou regulárnych výrazov si určíme masku a potom zisťujeme, či daný textový reťazec tejto maske vyhovuje. To znamená, že textový reťazec musí obsahovať rovnaké znaky ako regulárny výraz. Pri vytváraní regulárnych výrazov sa velmi často používajú tzv. metaznaky.

Metaznaky

Bodka a spätné lomítko
. ľubovoľný znak a.c zodpovedá abc, aoc, a2c a pod.
\ vracia metaznaku pôvodný význam a\+b zodpovedá a+b
Kvantifikátory
? minimálne 0x, maximálne 1x ab?c zodpovedá ac a abc
* minimálne 0x, maximálne neobmezene krát abcde* zodpovedá abcd, abcde, abcdeeee a pod.
+ minimálne 1x, maximálne neobmezene krát abcde* zodpovedá abcde, abcdeeee a pod.
{n} práve n-krát 10{6} zodpovedá práve 1000000
{m,n} minimálne m-krát, maximálne n-krát 10{2,4} zodpovedá práve 100, 1000 a 10000
{n,} minimálne n-krát 10{2,} zodpovedá 100, 1000, 10000 a pod.
Skupina znakov
[ ] jeden znak v zátvorkách [abc] zodpovedá práve a, b, c
[^ ] jeden znak neuvedený v zátvorkách [^abc] zodpovedá ľubovoľnému znaku okrem a, b, c
[ - ] jeden znak z rozsahu znakov [a-z] zodpovedá malým písmenám abecedy
\s biely znak (\n, \r, \t, medzera atď.) a\sb zodpovedá a b
\S iný než biely znak a\Sb zodpovedá a+b
\d číslice [0-9] a\db zodpovedá a2b
\D nečíselný znak a\Db zodpovedá axb
\w alfanumerický znak a podtržník a\wb zodpovedá 1, a, A, _ a pod.
\W nealfanumerický znak a\Wb zodpovedá $, !, ?, % a pod.
Hranice
ˆ na začiatku reťazca alebo riadku ^abc nájde abc len na začiatku reťazca/riadku
$ na konci reťazca alebo riadku xyz$ nájde xyz len na konci reťazca/riadku
Alternatívy a zoskupovanie
| oddeľuje niekoľko výrazov ahoj|nazdar zodpovedá práve jednému z reťazcov/pozdravov
oddeľuje niekoľko subvýrazov a(b|c) zodpovedá práve ab a ac
( ) kvantifikátor je aplikovaný na podreťazec ko(ko)?s zodpovedá práve kos a kokos
odkaz na podreťazec (\d)\1 resp. (\d)$1 zodpovedá 11, 22, 33 a pod.
Špeciálne zátvorkové konštrukcie
(?: ) uzátvorkovanie netvoriace spätnú referenciu (?:\d)(\d)\1 bude zodpovedať 122, 133, 455 a pod.
(?# ) komentár - text v zátvorkách za znakom # je ignorovaný a(?#test)b zodpvedá práve ab
(?= ) kladné tvrdenie o následujúcom abc(?=t) zodpovedá abc v abcd, ale nie v abca
(?! ) záporné tvrdenie o následujúcom abc(?!d) zodpovedá abc v abca, abcf, ale nie v abcd
(?<= ) kladné tvrdenie o predchádzajúcom \d{3}(?<=0) sekvencia 3 číslic; posledné musí byť 0
(?<! ) záporné tvrdenie o predchádzajúcom \d{3}(?<!0) sekvencia 3 číslic; posledné nesmie byť 0

Modifikátor Názov Funkčnosť
i ignore case nerozlišovanie malých/veľkých písmen
s single line
m multiple lines
x extended biele znaky a komentáre (znaky vpravo od #) sú ignorované
g global match hľadané všetky časti reťazca, ktoré zodpovedajú regulárnemu výrazu

Príklady

Regulárny výraz Výsledok
a+ sekvencia písmen a (1 a viac znakov)
a* sekvencia písmen a (0 a viac znakov)
o?sud osud alebo sud
adr(esa)? adr alebo adresa
vod(a|ka) voda alebo vodka
[0-9]|[1-9][0-9] čísla 0 až 99
\d{2} sekvencia dvoch číslic desiatkovej sústavy (00, 01, ...,98, 99)
[0-9a-fA-F]|[1-9a-fA-F][0-9a-fA-F]+ hexadecimálne čísla
(19|20)\d{2} letopočty 1900-2099
\d{2,6} sekvencia dvoch až šiestich číslic
[^ ,.]+ neprázdna sekvencia znakov, medzi ktorými nemôže byť medzera, čiarka alebo bodka
^P.* reťazec začína písmenom P, za ktorým nasleduje ľubovoľný (aj nulový) počet ľubovoľných znakov
\d+0$ reťazec končí znakom 0 (nula), ktorému predchádza minimálne jedna číslica
a+b ab, aab, aaab atď.
a\+b a+b

preg_replace()

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit [, int &$count ]] )

Funkcia hľadá zhodu regulárneho výrazu pattern s reťazcom subject. Pokiaľ je zhoda nájdená, časť reťazca subject zodpovedajúca regulárnemu výrazu pattern je nahradená reťazcom replacement.
Argument pattern môže byť reťazec alebo pole (pole regulárnych výrazov, ktoré sa použijú postupne pri porovnaní). Argument subject môže byť reťazec či pole (pole reťazcov, v ktorých sa má vykonať náhrada).
Pokiaľ došlo ku zhode, funkcia vracia zmenený reťazec (alebo pole reťazcov, pokiaľ je argumentom subject pole). Pokiaľ ku zhode nedošlo, vracia funkcia pôvodný reťazec alebo pole subject.

<?php
$string = "Reťazec má štyri slová.";
echo $string . "\n";
$string = preg_replace('štyri', '4', $string);
echo $string;
?>

Porovnávacie príklady

preg_match()

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags [, int $offset ]]] )

Funkcia nájde prvú zhodu regulárneho výrazu pattern s reťazcom subject. Pokiaľ je funkcii predaná referencia na pole matches, sú do tohto poľa uložené časti reťazca subject, ktoré zodpovedajú jednotlivým subvýrazom regulárneho výrazu pattern. Pod indexem 0 je v poli matches uložená zhoda s celým regulárnym výrazom. V ďalších prvkoch poľa (1, 2, 3 ,...) sú uložené reťazce zodpovedajúce jednotlivým subvýrazom.
Funkcia vracia 0 pokiaľ nebola nájdená zhoda, 1 pokiaľ zhoda bola nájdená. Pokiaľ pri vykonávaní funkcie došlo k chybe (napríklad vinou neplatného regulárneho výrazu), funkcia vracia FALSE.
Pokiaľ chceme nájsť všetky zhody regulárneho výrazu s reťazcom, musíme použiť funkciu preg_match_all().

<?php
if (!preg_match('/^[1-9]\d{2}$/',$cislo)) // premenná $cislo môže byť napríklad vstupom z formuláru
{
  echo "Zadané číslo nie je trojciferné!";
}
?>

Porovnávacie príklady