od RoliD » úte 08. zář 2015 23:30:10
Příklady regulárních výrazů
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 |
|
|
Příklady regulárních výrazů
Pojem [i]regulární výrazy[/i] 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í [b]metaznaky[/b].
V regulárních výrazech existuje několik typů metaznaků.
[ul][li]Základním metaznakem je . (tečka) – ta zastupuje právě jeden [b]libovolný znak[/b].[/li]
[li] Významnou skupinou metaznaků jsou [b]kvantifikátory[/b] (quantifiers) - ty určují kolikrát se smí opakovat znak předcházející kvantifikátoru.[/li]
[li]Pokud chceme v určitém místě povolit právě jeden ze [b]skupiny znaků[/b], 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][/li]
[li]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.[/li]
[li]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)[/li]
[li]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 [b]hranice[/b] (boundaries) nebo [b]ukotvení[/b] (anchors) – na různé typy hranic se podíváme níže.[/li][/ul]
[table][tr][th]Regulární výraz[/th]
[th]Co to znamená[/th][/tr]
[tr][td]a+[/td]
[td]sekvence písmen a (1 a více znaků)[/td][/tr]
[tr][td]a*[/td]
[td]sekvence písmen a (0 a více znaků)[/td][/tr]
[tr][td]o?kov[/td]
[td]okov či kov[/td][/tr]
[tr][td]tel(efon)?[/td]
[td]tel či telefon[/td][/tr]
[tr][td]telef(on|ax)[/td]
[td]telefon či telefax[/td][/tr]
[tr][td][0-9]|[1-9][0-9][/td]
[td]čísla 0 až 99[/td][/tr]
[tr][td]\d{2}[/td]
[td]sekvence dvou číslic desítkové soustavy (00, 01, ...,98, 99)[/td][/tr]
[tr][td][0-9a-fA-F]|[1-9a-fA-F][0-9a-fA-F]+[/td]
[td]hexadecimální čísla[/td][/tr]
[tr][td](19|20)\d{2}[/td]
[td]letopočty 1900-2099[/td][/tr]
[tr][td]\d{2,6}[/td]
[td]sekvence dvou až šesti číslic[/td][/tr]
[tr][td][^ ,.]+[/td]
[td]neprázdná sekvence znaků mezi nimiž nesmí být mezera ( ), čárka (,) či tečka (.)[/td][/tr]
[tr][td]^P.*[/td]
[td]řetězec, který začíná písmenem P za nímž následuje libovolný (i nulový) počet libovolných znaků[/td][/tr]
[tr][td]\d+0$[/td]
[td]řetězec, který končí znakem 0 (nula), kterému předchází minimálně jedna číslice[/td][/tr]
[tr][td]a+b[/td]
[td]ab, aab, aaab atd.[/td][/tr]
[tr][td]a\+b[/td]
[td]a+b[/td][/tr]
[tr][td]^[^,]+$[/td]
[td]řádek který neobsahuje čárku ,[/td][/tr]
[tr][td][i]^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*$[/i][/td]
[td]kontrola emailové adresy[/td][/tr]
[tr][td][a-zA-Z_.]+@[a-zA-Z_.]+[/td]
[td]jednodušší kontrola emailu, které stačí, že je něco před zavináčem a pak po něm[/td][/tr]
[tr][td]http://[a-zA-Z_.]+[/td]
[td]najde všechny url adresy v textu[/td][/tr]
[tr][td](http://)?w{3}[a-zA-Z_.]+\.cz[/td]
[td]najde všechny .cz domény v textu.. s http či bez[/td][/tr]
[tr][td]\d+\.\d+\.\d+\.\d+[/td]
[td]najde všechny IP adresy v textu[/td][/tr]
[tr][td][/td]
[td][/td][/tr][/table]
[table][tr][th][/th][/tr]
[tr][th]Znaky[/th][/tr]
[tr][td][i]x[/i][/td]
[td]znak [i]x[/i][/td][/tr]
[tr][td]\\[/td]
[td]zpětné lomítko[/td][/tr]
[tr][td]\0[i]n[/i][/td]
[td]znak v osmičkovém kódu 0[i]n[/i] (0 <= [i]n[/i] <= 7)[/td][/tr]
[tr][td]\x[i]hh[/i][/td]
[td]znak v hexadecimálním kódu 0×[i]hh[/i][/td][/tr]
[tr][td]\u[i]hhhh[/i][/td]
[td]znak UNICODE v hexadecimálním kódu 0×[i]hhhh[/i][/td][/tr]
[tr][td]\t[/td]
[td]znak tabulátor (‚\u0009‘)[/td][/tr]
[tr][td]\n[/td]
[td]znak nového řádku (‚\u000A‘)[/td][/tr]
[tr][td]\r[/td]
[td]znak posunu vozíku (‚\u000D‘)[/td][/tr]
[tr][th]Skupiny znaků[/th][/tr]
[tr][td][abc][/td]
[td]výčet znaků: a, b, nebo c[/td][/tr]
[tr][td][^abc][/td]
[td]jakýkoli znak kromě: a, b, nebo c(negace)[/td][/tr]
[tr][td][a-zA-Z][/td]
[td]a až z nebo A až Z, včetně (rozsah)[/td][/tr]
[tr][td][a-d[m-p]][/td]
[td]a až d, nebo m až p: [a-dm-p](sjednocení)[/td][/tr]
[tr][td][a-z&&[def]][/td]
[td]d, e, nebo f (průnik)[/td][/tr]
[tr][td][a-z&&[^bc]][/td]
[td]a až z, kromě b ac: [ad-z](rozdíl)[/td][/tr]
[tr][th]Předdefinované skupiny znaků[/th][/tr]
[tr][td]\d[/td]
[td]číslice: [0–9][/td][/tr]
[tr][td]\D[/td]
[td]opak číslice (negace): [^0–9][/td][/tr]
[tr][td]\s[/td]
[td]bílý znak: [ \t\n\x0B\f\r][/td][/tr]
[tr][td]\S[/td]
[td]opak bílého znaku: [^\s][/td][/tr]
[tr][td]\w[/td]
[td]slovo: [a-zA-Z[sub]0[/sub]-9][/td][/tr]
[tr][td]\W[/td]
[td]opak slova: [^\w][/td][/tr]
[tr][th]Hranice[/th][/tr]
[tr][td]^[/td]
[td]začátek řádku[/td][/tr]
[tr][td]$[/td]
[td]konec řádku[/td][/tr]
[tr][td]\b[/td]
[td]hranice slova[/td][/tr]
[tr][td]\B[/td]
[td]opak hranice slova (negace)[/td][/tr]
[tr][th]Kvantifikátory[/th][/tr]
[tr][td][i]X[/i]?[/td]
[td][i]X[/i], žádný nebo jeden[/td][/tr]
[tr][td][i]X[/i]*[/td]
[td][i]X[/i], žádný nebo více[/td][/tr]
[tr][td][i]X[/i]+[/td]
[td][i]X[/i], jeden nebo více[/td][/tr]
[tr][td][i]X[/i]{[i]n[/i]}[/td]
[td][i]X[/i], přesně [i]n[/i]krát[/td][/tr]
[tr][td][i]X[/i]{[i]n[/i],}[/td]
[td][i]X[/i], minimálně [i]n[/i]krát[/td][/tr]
[tr][td][i]X[/i]{[i]n[/i],[i]m[/i]}[/td]
[td][i]X[/i], minimálně [i]n[/i]krát, ale ne více než [i]m[/i]krát[/td][/tr]
[tr][th]Logické spojky[/th][/tr]
[tr][td][i]XY[/i][/td]
[td][i]X[/i] ihned za[i]Y[/i][/td][/tr]
[tr][td][i]X[/i]|[i]Y[/i][/td]
[td][i]X[/i] nebo[i]Y[/i][/td][/tr]
[tr][td]([i]X[/i])[/td]
[td]párování logických spojek
slouží také k zapamatování při nahrazování pomocí \1 až \\n/p>[/td][/tr][/table]
[table][tr][td]<span(.*?)>[/td]
[td]Najde všechny varianty tagu[/td][/tr]
[tr][td][/td]
[td][/td][/tr][/table]