MySQL Regularni izrazi (Regexp)

โšก Pametni saลพetak

MySQL Regularni izrazi (REGEXP) usporeฤ‘uju vrijednosti stupaca s fleksibilnim obrascima koje zamjenski znakovi ne mogu izraziti. Ovo objaลกnjava sintaksu REGEXP-a, sinonim RLIKE, svaki podrลพani metaznak, ispravljene primjere upita u bazi podataka myflixdb i funkcije regularnih izraza dodane u MySQL 8.0.

  • ๐Ÿ” srลพ Operator: REGEXP usporeฤ‘uje stupac s uzorkom i vraฤ‡a 1 za podudaranje, dok je RLIKE toฤan sinonim za REGEXP.
  • ๐Ÿงฉ Uzorak Anchors: Znak umetanja (^) usidrava podudaranje na poฤetak vrijednosti, a znak dolara ($) na kraj.
  • ๐Ÿ”ค Popisi likova: [abcd] odgovara bilo kojem zatvorenom znaku, a [^abcd] iskljuฤuje svaki zatvoreni znak iz skupa rezultata.
  • โž• Kvantifikatori: Zvjezdica, plus i upitnik primjenjuju se na pojedinaฤni znak koji im prethodi, a ne na cijeli niz.
  • ๐Ÿ›ก๏ธ Escaping Pravilo: Doslovna kosa crta unatrag mora se udvostruฤiti unutar uzorka, jer MySQL obraฤ‘uje niz dva puta.
  • ๐Ÿ†• Promjena verzije: MySQL Verzija 8.0 premjeลกtena je u ICU mehanizam, zamijenjene su [[:<:]] i [[:>:]] s \b, te su dodani REGEXP_LIKE, REGEXP_REPLACE, REGEXP_SUBSTR i REGEXP_INSTR.
  • โšก Napomena o izvedbi: REGEXP nikada ne koristi indeks, stoga prvo filtrirajte retke s indeksiranim uvjetom kad god upit to dopuลกta.

ล to su MySQL regularni izrazi?

MySQL pravilni izrazi pomoฤ‡i ฤ‡e vam u pretraลพivanju podataka koji odgovaraju sloลพenim kriterijima. Regularni izraz je uzorak koji opisuje oblik vrijednosti koju traลพite, a ne samu vrijednost.

Ako ste veฤ‡ radili s MySQL zamjenski znakovi, moลพda se pitate zaลกto se isplati uฤiti regularne izraze kada LIKE daje sliฤne rezultate. Odgovor je ekspresivna moฤ‡: zamjenski znakovi nude samo dva simbola, dok regularni izrazi opisuju raspone znakova, alternative, ponavljanje i pozicije rijeฤi u jednom uzorku.

Nakon ลกto je svrha utvrฤ‘ena, sljedeฤ‡i odjeljak predstavlja sintaksu koju ฤ‡ete koristiti u svakom REGEXP upitu.

Osnovna sintaksa REGEXP-a

Osnovna sintaksa regularnog izraza je sljedeฤ‡a.

SELECT * FROM table_name
WHERE fieldname REGEXP 'pattern';

OVDJE:

  • "SELECT izjava" je standard SELECT izraz.
  • "WHERE naziv polja" je naziv stupca na kojem se izvrลกava regularni izraz.
  • โ€œREGEXP 'uzorak'โ€ โ€” REGEXP je operator regularnog izraza, a 'pattern' predstavlja uzorak koji treba pronaฤ‡i. RLIKE je sinonim za REGEXP i vraฤ‡a iste rezultate. Kako biste izbjegli mijeลกanje s operatorom LIKE, bolje je koristiti REGEXP.

Pogledajmo sada praktiฤan primjer.

SELECT * FROM `movies`
WHERE `title` REGEXP 'code';

Gornji upit traลพi sve naslove filmova koji sadrลพe rijeฤ "code". Nije vaลพno pojavljuje li se "code" na poฤetku, u sredini ili na kraju naslova. Vraฤ‡a se redak sve dok naslov sadrลพi uzorak.

Usklaฤ‘ivanje poฤetka vrijednosti s popisom znakova

Pretpostavimo da ลพelimo filmove ฤiji naslovi poฤinju s a, b, c ili d, nakon ฤega slijedi bilo koji broj drugih znakova. Kombiniramo popis znakova s โ€‹โ€‹metaznakom karet kako bismo postigli taj rezultat.

SELECT * FROM `movies`
WHERE `title` REGEXP '^[abcd]';

Izvrลกavanje gornje skripte u MySQL Radna tezga u odnosu na bazu podataka myflixdb daje nam sljedeฤ‡e rezultate.

film_id naslov direktor godina_izdana kategorija_id
4 Code Ime Crno Edgar Jimz 2010 NULL
5 Tatine djevojฤice NULL 2007 8
6 Anฤ‘eli i demoni NULL 2007 6
7 Da Vinci Code NULL 2007 6

U uzorku '^[abcd]', znak za umetanje (^) zahtijeva da podudaranje poฤinje na poฤetku vrijednosti, a popis znakova [abcd] prihvaฤ‡a samo naslove ฤije je prvo slovo a, b, c ili d. Usporedba nije osjetljiva na velika i mala slova pod zadanim sortiranjem, zbog ฤega โ€žCode Vraฤ‡a se "Name Black".

Iskljuฤivanje znakova s โ€‹โ€‹popisa negiranih znakova

Sada modificirajmo skriptu i negirajmo popis znakova kako bismo vidjeli koji se retci vraฤ‡aju.

SELECT * FROM `movies`
WHERE `title` REGEXP '^[^abcd]';

Izvrลกavanje gornje skripte u MySQL Workbench na bazi podataka myflixdb daje nam sljedeฤ‡e rezultate.

film_id naslov direktor godina_izdana kategorija_id
1 Pirati s Kariba 4 Rob Marshall 2011 1
2 Zaboravljam Saru Marshal Nicholas stoller 2008 2
3 X-Men 2008
9 Honey moonERS John Schultz 2005 8
16 67% kriv 2012
17 Veliki diktator Chalie Chaplie 1920 7
18 primjer filma anoniman 8
19 film 3 John Brown 1920 8

Unutar popisa znakova, znak umetanja mijenja znaฤenje: '^[^abcd]' i dalje usidrava podudaranje na poฤetku, dok [^abcd] sada iskljuฤuje svaki naslov koji poฤinje jednim od zatvorenih znakova.

Ova dva primjera koriste samo sidra i popise znakova. Sljedeฤ‡i odjeljak pokriva cijeli skup metaznakova.

Metaznakovi regularnog izraza

Gornji primjeri prikazuju najjednostavniji oblik regularnog izraza. Metaznakovi vam omoguฤ‡uju fino podeลกavanje pretraลพivanja uzorka: izraลพavaju ponavljanje, alternative, raspone i pozicije. Tablica u nastavku navodi svaki metaznak koji podrลพava MySQL REGEXP operator, s ispravljenim primjerom za svaki od njih.

Char Description Primjer
* The zvjezdica (*) odgovara nula (0) ili viลกe instanci od jedan znak koji tome prethodi. SELECT * FROM movies WHERE naslov REGEXP 'da*'; odgovara slovu "d" nakon kojeg slijedi nula ili viลกe znakova "a", dakle Da Vinci Code i Daddy's Little Girls se kvalificiraju. Koristite 'da+' kada slovo "a" mora biti prisutno.
+ The viลกe (+) odgovara jednoj ili viลกe instanci znaka koji mu prethodi. SELECT * FROM `filmovi` WHERE `naslov` REGEXP 'pon+'; vraฤ‡a sve filmove koji sadrลพe "mon" nakon ฤega slijedi jedan ili viลกe znakova "n". Na primjer, Anฤ‘eli i demoni.
? The upitnik (?) odgovara nula (0) ili jednoj instanci znaka koji mu prethodi. SELECT * FROM `categories` WHERE `category_name` REGEXP 'com?'; "co" se podudara s neobaveznim "m". Na primjer, komedija i romantiฤna komedija.
. The toฤka (.) odgovara bilo kojem pojedinaฤnom znaku osim novog retka. SELECT * FROM movies WHERE `year_released` REGEXP '200.'; prikazuje sve filmove objavljene u godini poฤevลกi s "200" nakon ฤega slijedi bilo koji pojedinaฤni znak. Na primjer, 2005, 2007, 2008.
[abc] The popis znakova [abc] odgovara bilo kojem od zatvorenih znakova. SELECT * FROM `filmovi` WHERE `naslov` REGEXP '[vwxyz]'; prikazuje sve filmove koji sadrลพe bilo kojeg lika iz "vwxyz". Na primjer X-Men i Da Vinci Code.
[^abc] The negirani popis [^abc] odgovara bilo kojem znaku osim onih u zatvorenom. SELECT * FROM `filmovi` WHERE `naslov` REGEXP '^[^vwxyz]'; prikazuje sve filmove ฤiji naslov ne poฤinje znakom u "vwxyz".
[AZ] The raspon [AZ] odgovara bilo kojem velikom slovu. SELECT * FROM `ฤlanovi` WHERE `poลกtanska_adresa` REGEXP '[AZ]'; prikazuje sve ฤlanove ฤija poลกtanska adresa sadrลพi slovo izmeฤ‘u A i Z. Na primjer, Janet Jones s ฤlanskim brojem 1.
[the] The raspon [az] odgovara bilo kojem malom slovu. SELECT * FROM `ฤlanovi` WHERE `poลกtanska_adresa` REGEXP '[az]'; daje sve ฤlanove ฤija poลกtanska adresa sadrลพi slovo izmeฤ‘u a i z. Imajte na umu da zadana sortacija nije osjetljiva na velika i mala slova, pa ovaj raspon takoฤ‘er odgovara velikim slovima.
[0-9] The raspon [0-9] odgovara bilo kojoj znamenki od 0 do 9. SELECT * FROM `ฤlanovi` WHERE `kontaktni_broj` REGEXP '[0-9]'; daje sve ฤlanove ฤiji kontaktni broj sadrลพi barem jednu znamenku. Na primjer, Robert Phil.
^ The znak za umetanje (^) usidrava podudaranje na poฤetak vrijednosti. SELECT * FROM `filmovi` WHERE `naslov` REGEXP '^[cd]'; prikazuje sve filmove ฤiji naslov poฤinje s "c" ili "d". Na primjer Code Ime Black, Tatine male djevojฤice i Da Vinci Code.
$ The znak dolara ($) usidrava podudaranje na kraj vrijednosti. SELECT * FROM `filmovi` WHERE `naslov` REGEXP 'kod$'; prikazuje sve filmove ฤiji naslov zavrลกava s "kod". Na primjer, Da Vinci Code.
| The okomita crta (|) izolira alternative. SELECT * FROM `filmovi` WHERE `naslov` REGEXP '^[cd]|^[u]'; prikazuje sve filmove ฤiji naslov poฤinje s "c", "d" ili "u". Na primjer Code Ime Black, Da Vinci Codei Podzemlje โ€“ Awakening..
\b The granica rijeฤi (\b) odgovara poฤetku ili kraju rijeฤi. Zamjenjuje starije markere [[:<:]] i [[:>:]], koji MySQL 8.0 uklonjeno. SELECT * FROM `filmovi` WHERE `naslov` REGEXP '\\bfor'; navodi sve filmove ฤija rijeฤ poฤinje s "za". Na primjer, Zaboravljajuฤ‡i Sarah Marshal. Na MySQL 5.7 ekvivalentni uzorak je '[[:<:]]za'.
[[:razred:]] The klasa karaktera odgovara imenovanoj skupini znakova: [[:alpha:]] za slova, [[:space:]] za razmake, [[:punct:]] za interpunkcijske znakove i [[:upper:]] za velika slova. Imajte na umu dvostruko uglate zagrade. SELECT * FROM `filmovi` WHERE `naslov` REGEXP '^[[:alpha:][:space:]]+$'; daje sve filmove ฤiji naslov sadrลพi samo slova i razmake. Na primjer, Zaboravljajuฤ‡i Sarah Marshal, dok je Pirati s Kariba 4 izostavljen zbog znamenke.

Obrnuta kosa crta (\) je znak za izlaz. Jer MySQL prvo parsira niz, a zatim uzorak, doslovna obrnuta kosa crta mora biti napisana kao dvostruka obrnuta kosa crta (\\) unutar REGEXP uzorka.

โš ๏ธ Upozorenje o verziji: MySQL Verzija 8.0.4 zamijenila je stari mehanizam regularnih izraza bibliotekom ICU. Oznake rijeฤi [[:<:]] i [[:>:]] uklonjene su u tom izdanju, pa uzorci kopirani iz starijeg materijala ne uspijevaju s "sintaktiฤkom pogreลกkom" na MySQL 8.0. Umjesto toga koristite \b.

Sada kada je svaki metaznak definiran, postavlja se opravdano pitanje: kada bi REGEXP trebao zamijeniti jednostavniji LIKE operator?

REGEXP vs. LIKE: koji biste trebali koristiti?

Oba operatora filtriraju retke prema uzorku, ali rjeลกavaju razliฤite probleme. LIKE razumije samo dva simbola, dok REGEXP razumije cijeli skup metaznakova prikazan gore. Ta moฤ‡ ima svoju cijenu, pa je izbor kompromis, a ne preferencija.

Kriterij LIKE REGEXP
Simboli uzoraka samo % i _ Anchors, rasponi, alternacija, kvantifikatori, klase znakova
Tipiฤna upotreba Pretrage prefiksa, sufiksa i "sadrลพi" Validacija, viลกe alternativa, usklaฤ‘ivanje na temelju pozicije
Koriลกtenje indeksa Moguฤ‡e kada uzorak ne poฤinje s % Nikad ne koristi indeks
Povratna vrijednost TOฤŒNO ili NETOฤŒNO 1 ili 0, i NULL kada je bilo koji operand NULL

Odaberite LIKE za jednostavno podudaranje, jer se dobro ฤita i joลก uvijek moลพe koristiti indeks. Odaberite REGEXP kada jedan uzorak mora izraziti nekoliko pravila odjednom, kao ลกto je โ€žpoฤinje s c ili d i zavrลกava znamenkomโ€œ. U velikim tablicama prvo suzite retke indeksiranim uvjetom, a zatim primijenite REGEXP na taj manji skup.

MySQL 8.0 funkcije regularnih izraza

Operator REGEXP odgovara samo na jedno pitanje: odgovara li vrijednost uzorku? MySQL Verzija 8.0 dodala je ฤetiri funkcije koje idu dalje i omoguฤ‡uju vam lociranje, npr.tract i prepiลกite odgovarajuฤ‡i tekst. Svaki prihvaฤ‡a opcionalni argument match_type, gdje 'c' nameฤ‡e usporedbu koja razlikuje velika i mala slova, a 'i' nameฤ‡e usporedbu koja ne razlikuje velika i mala slova.

  • REGEXP_LIKE(izraz, uzorak) vraฤ‡a 1 kada vrijednost odgovara uzorku. To je funkcijski oblik operatora REGEXP, a argument match_type eksplicitno odreฤ‘uje osjetljivost na velika i mala slova.
  • REGEXP_INSTR(izraz, uzorak) vraฤ‡a poziciju prvog znaka podudaranja ili 0 kada uzorak nije pronaฤ‘en.
  • REGEXP_SUBSTR(izraz, uzorak) vraฤ‡a sam odgovarajuฤ‡i podniz, ลกto je korisno za izvlaฤenje godine, koda ili broja iz duลพe tekstualne vrijednosti.
  • REGEXP_REPLACE(izraz, uzorak, zamjena) vraฤ‡a vrijednost sa svakim zamijenjenim podudaranjem, tako da moลพe oฤistiti podatke unutar SQL upit za aลพuriranje.
SELECT title,
       REGEXP_SUBSTR(title, '[0-9]+') AS number_in_title
FROM `movies`
WHERE REGEXP_LIKE(title, '[0-9]');

Gornji upit vraฤ‡a svaki naslov filma koji sadrลพi znamenku, zajedno sa samim znamenkama. MySQL 5.7 ove funkcije nisu dostupne, pa operator REGEXP ostaje jedina opcija.

Pitanja i odgovori

Ne prema zadanim postavkama. REGEXP slijedi sortiranje stupca, a standardna sortiranja ne razlikuju velika i mala slova. Dodajte kljuฤnu rijeฤ BINARY prije stupca ili pozovite REGEXP_LIKE s vrstom podudaranja 'c' kako biste prisilili usporedbu koja razlikuje velika i mala slova.

Nema funkcionalne razlike. RLIKE je sinonim za REGEXP koji MySQL zadrลพava se radi kompatibilnosti. REGEXP se preferira u praksi, jer se RLIKE lako pomijeลกa s nepovezanim LIKE operator koristi se za zamjenske znakove.

REGEXP ne moลพe koristiti indeks, stoga MySQL procjenjuje uzorak redak po redak. Prvo smanjite skenirane retke indeksiranim uvjetom, rasponom datuma ili indeksom punog teksta i primijenite regularni izraz na taj manji skup rezultata.

Da. AI asistenti pretvaraju pravilo obiฤnog jezika u REGEXP uzorak i objaลกnjavaju svaki metaznak. Testirajte rezultat u MySQL Radna tezga u odnosu na uzorke redaka, jer jedno pogreลกno postavljeno sidro mijenja cijeli skup rezultata.

Da. AI asistenti generiraju REGEXP_REPLACE naredbe koje uklanjaju interpunkcijske znakove, normaliziraju telefonske brojeve ili uklanjaju zalutale razmake. Prvo pokrenite uzorak unutar SELECT-a, potvrdite prepisane vrijednosti i tek zatim ga primijenite u UPDATE izjava.

Saลพmite ovu objavu uz: