Regulár, regex, regexp, ale hlavně regulární výraz. Pro některé slova povědomá a pro ostatní zcela neznámá. Ale jsou i lidé, kteří je používají denně a nedokážou si bez nich práci s daty představit. Buďte mezi nimi i vy!
Na internetu je hromada návodů na tvorbu regulárů z pohledu programování a databází, ale nikde se neřeší čistě markeťácké potřeby. Jako studentka informatiky jsem se setkala s regulárními výrazy, ale co člověk pochytí ve škole, není pak v práci prakticky schopen použít a do půl roku zapomene i podstatu. Proto jsem se rozhodla sestavit návod pro ty, kdo o regulárech neví zhola nic anebo o nich jen slyšeli, ale nikdy nevěděli, jak je použít.
V online sféře je nespočet nástrojů, které používají k filtrování a očišťování dat právě regulární výrazy. Kdo si však myslí, že si vystačí pouze s filtrem „obsahuje“ (contains), se může docela mýlit a určitě nejednou narazí na případ, kdy bude tento filtr nedostatečný.
I když například AdWords reguláry nepodporuje, setkáme se s nimi v Google Analytics nebo v dalších nástrojích (PPC Bee, AdBoost). Najdeme je také v obyčejných tabulkových editorech, jako je LibreOffice Calc. Výborné je například použití při procházení a čištění XML feedů.
Pozor na syntax
Abychom na to šli od začátku. Regexp si můžeme představit jako textový řetězec, který využívá omezenou sadu znaků pro filtrování či manipulaci s textem. V programovaní slouží hlavně pro kontrolu správně zadaných informací do formulářů (zkontroluju si, že emailová adresa obsahuje zavináč a neobsahuje diakritiku). Abych byla přesnější, regulární výraz je textový řetězec, který tvoří masku (předpis, vzor) nad jiným textovým řetězcem (například, že telefonní číslo se skládá z devíti číslic).
V následujících řádcích si vysvětlíme význam jednotlivých speciálních znaků a ukážeme si jejich praktické využití. Musíme přitom pamatovat na to, že ne všechny nástroje mají totožnou syntax, protože běží díky rozdílným programovacím jazykům, ale neměl by existovat žádný závažný problém, který se nedá řešit.
Operátor | Popis | Příklad |
---|---|---|
| | nebo | a|b = a nebo b |
. | Jakýkoliv symbol včetně bílých znaků | p.k = pak, plk, p k, p2k |
* | Zajistí opakování znaku od 0 do nekonečna | 3* = „nic“,3,33,333, atd. |
+ | Zajistí opakování znaku od 1 do nekonečna | 3+ = 3, 33, 333, atd. |
? | Zajistí opakování znaku od 0 do 1 | 3? = „nic“, 3 |
a{x}, a = znak, x = celé číslo | Zajistí opakování znaku kolikrát zadáme do složených závorek | 2{3} = 222 |
a{x,y}, a = znak, x = celé číslo, y = celé číslo > x | Zajistí opakování znaku v zadaném intervalu | 2{1,3} = 2,22,222 |
\d | Všechny numerické znaky | \d+ = libovolně dlouhý řetězec za sebou jdoucích číslic |
\D | Všechny nenumerické znaky včetně bílých znaků | |
\w | Všechna písmena | |
\W | Všechny nepísmenné znaky včetně bílých | |
\s | Bílé znaky jako mezery, tabulátory , „entery“ | \s{2,} = případ, kdy je za sebou více mezer nebo jiných bílých znaků |
\S | Všechny viditelné znaky | |
\ | Znaménko, které udělá z operátorů klasický znak | \+, \*, \/, \|, \?, \. |
^ | Začátek řádku | ^a.* = vše, co začíná písmenem a |
$ | Konec řádku | .*a$ = vše, co končí písmenem a |
Příklady z praxe
A tady už se dostáváme od teorie k praxi. Připravila jsem reálné příklady, které jsem řešila při práci s daty. Připomínám, že tyto operace nám slouží k vyhledávání řetězců a řádků, případně k operacím na částech textu (například „najít a nahradit“).
- Produkt obsahuje %vlastní název% „+ Dárek zdarma“ a chci označit všechno za + včetně něj.
- Můj výraz bude: \s*\+.*
- \s* značí mezeru před plusem, která tam může být a nemusí
- \+ značí samotné plus
- .* znamená nekonečno jakýchkoli znaků
- výraz je možné rozšířit i o znaky za pomlčkou: \s*(\+|-).*
- případně jen výrazy, které obsahují slovo „zdarma“: \s*(\+|-).*(zdarma).*
2. Dalším problémem je, jak vybrat všechny znaky v závorkách.
- jednoduše: \s\(.*\)
- Lomítka říkají, že závorka je znak a ne operátor.
- V regexech je možné i závorkovat, jako jsme zvyklí z matematiky. Jeden takový příklad můžete vidět výše.
- \s ošetřuje i mezeru před závorkami
3. Více mezer za sebou už jsme si ukázali v tabulce, ale co když nám zbude mezera na konci řádku?
- \s$
- nebo mezera na začátku řádku: ^\s
4. Pokud chceme pracovat s řádky obsahující konkrétní řetězec, například slovo „batoh“ můžeme napsat:
- řádky obsahující slovo batoh: .*(batoh).*
- řádky začínající slovem batoh: ^(batoh).*
- končící slovem batoh: .*(batoh)$
5. Můžeme například filtrovat i jednoslovné řádky bez čísel.
- ^(\w+)$
6. A co dvojslovný výraz?
- ^\w+\s\w+$
- Pokud bychom zde nepoužili začátek a konec řádku, výraz by nefungoval správě.
7. Řádky končící spojkami a předložkami
- *(a|na|do|z|s|bez|v|od|ale|nebo|ani)$
8. Řádky obsahující například délku
- předpoklad, že může být nesčetně mnoho čísel, za nimi mezera a za nimi jednotka doplněná o mezeru před čísly: \s\d+\s(mm|cm|dm|m|km)
9. Řádky končící otazníkem
- .*\?$
10. Při velkém očišťování by se mohlo stát, že nám na řádku zbude pouze nějaké nesmyslné slovo (např. předložky).
- Tato slova můžeme vyhledat za předpokladu, že mají tři a méně písmen tímto regexem: ^\w{0,3}$.
Svoje regulární výrazy si můžete zkontrolovat v aplikaci rubular.com. O případnou radu můžete požádat i v komentářích pod článkem a já se vám pokusím ze všech sil pomoci.
Přeji příjemnou práci s daty a doufám, že si reguláry oblíbíte stejně jako já. 😉