LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> 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 27946×

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

pridej.cz

 

DISKUZE

Jo ctenari... 2.9.2005 07:07 MaReK Olšavský
  L Re: Jo ctenari... 2.9.2005 07:35 Petr Zajíc
    L Re: Jo ctenari... 2.9.2005 08:06 MaReK Olšavský




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

15.1.2018 0:51 /František Kučera

První letošní pražský sraz se koná již tento čtvrtek 18. ledna od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Vítáni jsou všichni příznivci svobodného softwaru a hardwaru, ESP32, DIY, CNC, SDR nebo dobrého piva. Prvních deset účastníků srazu obdrží samolepku There Is No Cloud… just other people's computers. od Free Software Foundation.


Přidat komentář

14.11.2017 16:56 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt – tradičně první čtvrtek před třetím pátkem v měsíci: 16. listopadu od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

12.11.2017 11:06 /Redakce Linuxsoft.cz
PR: 4. ročník odborné IT konference na téma Datová centra pro business proběhne již ve čtvrtek 23. listopadu 2017 v konferenčním centru Vavruška, v paláci Charitas, Karlovo náměstí 5, Praha 2 (u metra Karlovo náměstí) od 9:00. Konference o návrhu, budování, správě a efektivním využívání datových center nabídne odpovědi na aktuální a často řešené otázky, např Jaké jsou aktuální trendy v oblasti datových center a jak je využít pro vlastní prospěch? Jak zajistit pro firmu či jinou organizaci odpovídající služby datových center? Podle jakých kritérií vybrat dodavatele služeb? Jak volit součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně spravovat datové centrum? Jak eliminovat možná rizika? apod.
Přidat komentář

13.9.2017 8:00 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt – tentokrát netradičně v pondělí: 18. září od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

3.9.2017 20:45 /Redakce Linuxsoft.cz
PR: Dne 21. září 2017 proběhne v Praze konference "Mobilní řešení pro business". Hlavní tématy konference budou: nejnovější trendy v oblasti mobilních řešení pro firmy, efektivní využití mobilních zařízení, bezpečnostní rizika a řešení pro jejich omezení, správa mobilních zařízení ve firmách a další.
Přidat komentář

15.5.2017 23:50 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 18. května od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

12.5.2017 16:42 /Honza Javorek
PyCon CZ, česká konference o programovacím jazyce Python, se po dvou úspěšných ročnících v Brně bude letos konat v Praze, a to 8. až 10. června. Na konferenci letos zavítá např. i Armin Ronacher, známý především jako autor frameworku Flask, šablon Jinja2/Twig, a dalších projektů. Těšit se můžete na přednášky o datové analytice, tvorbě webu, testování, tvorbě API, učení a mentorování programování, přednášky o rozvoji komunity, o použití Pythonu ve vědě nebo k ovládání nejrůznějších zařízení (MicroPython). Na vlastní prsty si můžete na workshopech vyzkoušet postavit Pythonem ovládaného robota, naučit se učit šestileté děti programovat, efektivně testovat nebo si v Pythonu pohrát s kartografickým materiálem. Kupujte lístky, dokud jsou.
Přidat komentář

2.5.2017 9:20 /Eva Rázgová
Putovní konference československé Drupal komunity "DrupalCamp Československo" se tentokrát koná 27. 5.2017 na VUT FIT v Brně. Můžete načerpat a vyměnit si zkušenosti z oblasti Drupalu 7 a 8, UX, SEO, managementu týmového vývoje, využití Dockeru pro Drupal a dalších. Vítáni jsou nováčci i experti. Akci pořádají Slovenská Drupal Asociácia a česká Asociace pro Drupal. Registrace na webu .
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

16.1.2018 1:08 / Ivan Pittner
verejna ip od o2 ubuntu

15.1.2018 17:26 / Mira Harvalik
Re: Jak udělat HTML/Javascript swiping gallery do mobilu?

30.12.2017 20:16 / Michal Knoll
odmocnina

31.8.2017 12:11 / Jaromir Obr
Re: ukůládání dat ze souboru

30.7.2017 11:12 / Jaromir Obr
Národní znaky

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2018) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze