MySQL (36) - Regulární výrazy
Když se sestavovala osnova tohoto seriálu, vyžádali si čtenáři zvláštní díl na regulární výrazy. Nuže, toto jest on.
2.9.2005 07:00 |
Petr Zajíc
| Články autora
| přečteno 31903×
Jedním z největších překvapení při mém přechodu na Linux kdysi bylo,
s jakou silou a razancí se všude používají regulární výrazy. Upřímně mě
to nadchlo, protože je to elegantní, rychlé a výkonné řešení. Ne snad
že by regulární výrazy byly vždy "to nej" nebo že by byly
samospasitelné - ale přinejmenším se vyplatí o nich vědět. Pronikly i
do MySQL, a právě o tom bude dnešní článek.
Regulární výrazy
Pokud byste dostatečně nevěděli, co to regulární výrazy jsou, pak
vězte, že se jedná o nástroje pro vyhledávání textu (případně jeho
nahrazování) pomocí důmyslných pravidel a zástupných znaků. Než bych se
pokoušel o nějakou vzletnou a nicneříkající definici, poskytnu raději
dychtivým čtenářům několik odkazů, které je zasvětí a přejdu rovnou k
myšlenkám, týkajícím se MySQL. Takže, o regulárních výrazech se můžete
něco málo dozvědět:
MySQL a regulární výrazy
V MySQL jsou regulární výrazy zastoupeny de facto jedinou funkcí, a
to REGEXP.
Opravdoví znalci namítnou, že existuje ještě funkce NOT REGEXP (což je
pravda), a funkce RLIKE a NOT RLIKE (ty jsou ale sysnonymem funkcí
REGEXP a NOT REGEXP). Zapište si za uši, že MySQL má pouze nástroje pro
vyhledávání podle regulárních výrazů, nikoli však odpovídající nástroje
pro změnu dat. Nic takového, jako je například PHP funkce ereg_replace
v MySQL nenajdete.
Abych nebyl jen negativní - pro účely vyhledávání může být REGEXP
poměrně užitečný. Z tabulky zaměstnanců:
create table pracovnik
(prijmeni varchar(20), jmeno varchar(15));
insert into pracovnik (prijmeni, jmeno) values ('Zajíc','Petr');
insert into pracovnik (prijmeni, jmeno) values ('Zajícová','Veronika');
insert into pracovnik (prijmeni, jmeno) values ('Novák','Josef');
insert into pracovnik (prijmeni, jmeno) values ('Procházka','Karel');
insert into pracovnik (prijmeni, jmeno) values ('Horáková','Jana');
insert into pracovnik (prijmeni, jmeno) values ('Nováková','Marie');
můžete například vybírat podle sloupce prijmeni s pomocí regexp lidi,
jejichž příjmení obsahuje písmeno "a" takto:
select * from pracovnik
where prijmeni regexp 'a';
Lidi, jejichž příjmení končí na "ová" zase můžete najít pomocí
následujícího kódu (Novák tam nebude,
protože nekončí na "ová"):
select * from pracovnik
where prijmeni regexp 'ová$';
Nebo lidi, jejichž příjmení začíná na "Z" a končí na "c" zjistíte
takhle:
select * from pracovnik
where prijmeni regexp '^Z.+c$';
Jak to obejít
Přestože jsou regulární výrazy mnohem mocnější než to, co jsem
předvedl, dají se leckdy přepsat pomocí operátoru LIKE
a tak se jim můžete úplně vyhnout. Uvádím to proto, že pro mnohé z
nás je syntaxe LIKE daleko pochopitelnější než regulární výrazy. V
porovnání LIKE existují pouze dva zástupné znaky - "%" (procento)
zastupuje libovolné množství znaků (včetně žádného) a "_" (podtržítko)
zastupuje právě jeden znak.
Dotazy výše by se tedy v tomto případě daly všechny přepsat:
select * from pracovnik
where prijmeni like '%a%';
select * from pracovnik where prijmeni like '%ová';
select * from pracovnik where prijmeni like 'Z%c';
Pozn.: Není to tak úplně přesné.
Výraz "zc" by v posledním případě s
použitím LIKE prošel, ale s použitím regexp nikoli (neobsahuje mezi "z"
a "c" žádné další znaky, ale měl by). Z toho je vidět, že regulární
výrazy jesou mnohem mocnější než like a také to, že při přepisu regexp
na like je třeba dávat si pozor.
Rychlost zpracování regulárních výrazů
Panuje názor, že provedení regulárního výrazu je mnohem pomalejší
než porovnání pomocí LIKE. Něco takového je logické, protože regulární
výrazy jsou mnohem komplikovanější než prosté porovnání se zástupnými
znaky. Abych Vám pomohl udělat si představu o tom, jaký je to rozdíl, a
abych vás naučil testovat dobu provádění funkcí v MySQL, představím Vám
v tomto díle seriálu ještě informační funkci
BENCHMARK.
MySQL funkce BENCHMARK je sama o sobě k ničemu, protože vrací vždy
nulu. Slouží pouze k tomu, aby zopakovala předaný příkaz s předaným
počtem opakování. Co nás opravdu zajímá je fakt, jak dlouho taková akce
bude trvat. Jelikož mysql vrací dobu potřebnou k vykonání posledního
příkazu, můžeme pomocí BENCHMARK spustit x-krát danou funkci a změřit,
jak dlouho to celé bude trvat. Takže milionkrát spustím test s LIKE:
SELECT
BENCHMARK(1000000,'Zajic' LIKE 'Z%c');
a milionkrát spustím test s regexp:
SELECT
BENCHMARK(1000000,'Zajic' regexp '^Z.+c$');
a výsledek? Průměr ze tří testů ukázal, že milionkrát porovnání
pomocí LIKE trvalo 0,5 vteřiny, kdežto milionkrát porovnání pomocí
regexp trvalo 1,5 vteřiny. Můžeme tedy prohlásit, že v tomto případě
bylo použití regulárních výrazů zhruba třikrát pomalejší.
Pozn.: Testy tohoto typu by se
však neměly brát jako dogma. Nezapomínejte, že stěží budete porovnávat
v reálné aplikaci milionkrát za sebou regulární výraz. V praxi zřejmě
rozdíl ve výkonu LIKE vůči REGEXP vůbec nepocítíte. Měli byste však
vědět, že je to pomalejší a že pomocí funkce BENCHMARK to lze změřit.
Verze pro tisk
|
Příspívat do diskuze mohou pouze registrovaní uživatelé.
|
|

Vyhledávání software

Vyhledávání článků
28.11.2018 23:56 /František Kučera Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz 22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz 20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
Více ...
Přidat zprávičku
 Poslední diskuze
31.7.2023 14:13 /
Linda Graham iPhone Services
30.11.2022 9:32 /
Kyle McDermott Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš Re: zavináč
2.12.2018 23:56 /
František Kučera Sraz
5.10.2018 17:12 /
Jakub Kuljovsky Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?
Více ...
|