Pojem regulární výrazy je pro mnoho lidí docela strašák a sám o sobě moc neříká. Trošku to popíšu a doufám že jednoduše. Začnu zástupnými znaky * a ?, které můžete známe z mnoha jiných systémů a aplikací. (třeba z příkazové řádky "cmd" windows) . Regulární výrazy disponují mnohem více speciálními znaky než * a ?. Speciální znaky se v regulárních výrazech nazývají metaznaky.
V regulárních výrazech existuje několik typů metaznaků.
- Základním metaznakem je . (tečka) – ta zastupuje právě jeden libovolný znak.
- Významnou skupinou metaznaků jsou kvantifikátory (quantifiers) - ty určují kolikrát se smí opakovat znak předcházející kvantifikátoru.
- Pokud chceme v určitém místě povolit právě jeden ze skupiny znaků, uzavřeme takovou skupinu znaků do hranatých závorek ([ a ]). Pokud chceme naopak definovat, že v daném místě smí být libovolný znak s výjimkou několika určitých znaků, uzavřeme „zakázané” znaky opět do hranatých závorek a za [ jestě doplníme ^. Zápis [^ab], tak bude znamenat, že se v daném místě má vyskytovat jeden libovolný znak kromě znaků a a b.
Pro často používané skupiny znaků existují speciální zkratky (například zápis \d zastupuje všechny číslice 0-9) – viz tabulku níže.
Pokud chceme definovat skupinu znaků, které následují v abecedě (resp. přesněji v tabulce znaků) za sebou, můžeme je zapsat jako interval, například [1-5], [a-e] nebo třeba [A-Z] - Pokud potřebujeme zajistit, opakování určité sekvence znaků (ne jen znaku jednoho), můžeme sekvenci znaků uzavřít do závorek (( a )) a pokud za pravou kulatou závorku doplníme kvantifikátor, bude se počet opakování vztahovat na celou sekvenci znaků uzavřenou do závorek.
- Pokud chceme dát na výběr několik variant textu (třeba Petr nebo Pavel), jako oddělovač variant použijeme metaznak | (výraz bude tedy Petr|Pavel)
- Pokud chceme přikázat, že hledaný textový řetězec se musí nacházet na začátku nebo konci prohledávaného textu, použijeme metaznaky, které nazýváme hranice (boundaries) nebo ukotvení (anchors) – na různé typy hranic se podíváme níže.
Regulární výraz | Co to znamená |
---|---|
a+ | sekvence písmen a (1 a více znaků) |
a* | sekvence písmen a (0 a více znaků) |
o?kov | okov či kov |
tel(efon)? | tel či telefon |
telef(on|ax) | telefon či telefax |
[0-9]|[1-9][0-9] | čísla 0 až 99 |
\d{2} | sekvence dvou číslic desítkové soustavy (00, 01, ...,98, 99) |
[0-9a-fA-F]|[1-9a-fA-F][0-9a-fA-F]+ | hexadecimální čísla |
(19|20)\d{2} | letopočty 1900-2099 |
\d{2,6} | sekvence dvou až šesti číslic |
[^ ,.]+ | neprázdná sekvence znaků mezi nimiž nesmí být mezera ( ), čárka (,) či tečka (.) |
^P.* | řetězec, který začíná písmenem P za nímž následuje libovolný (i nulový) počet libovolných znaků |
\d+0$ | řetězec, který končí znakem 0 (nula), kterému předchází minimálně jedna číslice |
a+b | ab, aab, aaab atd. |
a\+b | a+b |
^[^,]+$ | řádek který neobsahuje čárku , |
^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*$ | kontrola emailové adresy |
[a-zA-Z_.]+@[a-zA-Z_.]+ | jednodušší kontrola emailu, které stačí, že je něco před zavináčem a pak po něm |
http://[a-zA-Z_.]+ | najde všechny url adresy v textu |
(http://)?w{3}[a-zA-Z_.]+\.cz | najde všechny .cz domény v textu.. s http či bez |
\d+\.\d+\.\d+\.\d+ | najde všechny IP adresy v textu |
Znaky | |
---|---|
x | znak x |
\\ | zpětné lomítko |
\0n | znak v osmičkovém kódu 0n (0 <= n <= 7) |
\xhh | znak v hexadecimálním kódu 0×hh |
\uhhhh | znak UNICODE v hexadecimálním kódu 0×hhhh |
\t | znak tabulátor (‚\u0009‘) |
\n | znak nového řádku (‚\u000A‘) |
\r | znak posunu vozíku (‚\u000D‘) |
Skupiny znaků | |
[abc] | výčet znaků: a, b, nebo c |
[^abc] | jakýkoli znak kromě: a, b, nebo c(negace) |
[a-zA-Z] | a až z nebo A až Z, včetně (rozsah) |
[a-d[m-p]] | a až d, nebo m až p: [a-dm-p](sjednocení) |
[a-z&&[def]] | d, e, nebo f (průnik) |
[a-z&&[^bc]] | a až z, kromě b ac: [ad-z](rozdíl) |
Předdefinované skupiny znaků | |
\d | číslice: [0–9] |
\D | opak číslice (negace): [^0–9] |
\s | bílý znak: [ \t\n\x0B\f\r] |
\S | opak bílého znaku: [^\s] |
\w | slovo: [a-zA-Z0-9] |
\W | opak slova: [^\w] |
Hranice | |
^ | začátek řádku |
$ | konec řádku |
\b | hranice slova |
\B | opak hranice slova (negace) |
Kvantifikátory | |
X? | X, žádný nebo jeden |
X* | X, žádný nebo více |
X+ | X, jeden nebo více |
X{n} | X, přesně nkrát |
X{n,} | X, minimálně nkrát |
X{n,m} | X, minimálně nkrát, ale ne více než mkrát |
Logické spojky | |
XY | X ihned zaY |
X|Y | X neboY |
(X) | párování logických spojek slouží také k zapamatování při nahrazování pomocí \1 až \\n/p> |
<span(.*?)> | Najde všechny varianty tagu |