MySQL Regulaaravaldised (Regaxp)

โšก Nutikas kokkuvรตte

MySQL Regulaaravaldised (REGEXP) sobitavad veeruvรครคrtusi paindlike mustritega, mida metamรคrgid ei suuda vรคljendada. See selgitab REGEXP sรผntaksit, RLIKE sรผnonรผรผmi, kรตiki toetatud metamรคrke, parandatud pรคringunรคiteid myflixdb andmebaasi suhtes ja lisatud regulaaravaldiste funktsioone. MySQL 8.0.

  • ๐Ÿ” tuum Operator: REGEXP vรตrdleb veergu mustriga ja tagastab vaste korral vรครคrtuse 1, samas kui RLIKE on REGEXP tรคpne sรผnonรผรผm.
  • ๐Ÿงฉ Muster Anchors: Keskmรคrk (^) ankurdab vaste vรครคrtuse algusesse ja dollarimรคrk ($) lรตppu.
  • ๐Ÿ”ค Tegelaskujude loendid: [abcd] leiab vaste mis tahes รผmbritsetud tรคhemรคrgile ja [^abcd] jรคtab kรตik รผmbritsevad tรคhemรคrgid tulemuste hulgast vรคlja.
  • โž• Kvantifikaatorid: Tรคrn, plussmรคrk ja kรผsimรคrk kehtivad neile eelneva รผksiku tรคhemรคrgi, mitte kogu stringi kohta.
  • ๐Ÿ›ก๏ธ Sรถรถtping Reegel: Mustri sees tuleb sรตnasรตnaline kaldkriips kahekordistada, sest MySQL tรถรถtleb stringi kaks korda.
  • ๐Ÿ†• Versiooni muutus: MySQL 8.0 kolis ICU mootorisse, asendas [[:<:]] ja [[:>:]] \b-ga ning lisas REGEXP_LIKE, REGEXP_REPLACE, REGEXP_SUBSTR ja REGEXP_INSTR.
  • โšก Toimivuse mรคrkus: REGEXP ei kasuta kunagi indeksit, seega filtreeri ridu esmalt indekseeritud tingimusega, kui pรคring seda lubab.

Mis on MySQL regulaaravaldised?

MySQL regulaarsed vรคljendid aitavad teil otsida andmeid, mis vastavad keerukatele kriteeriumidele. Regulaaravaldis on muster, mis kirjeldab otsitava vรครคrtuse kuju, mitte vรครคrtust ennast.

Kui olete juba tรถรถtanud MySQL metamรคrgid, vรตite kรผsida, miks on regulaaravaldiste รตppimine vรครคrt, kui LIKE annab sarnaseid tulemusi. Vastus on vรคljendusvรตime: metamรคrgid pakuvad ainult kahte sรผmbolit, samas kui regulaaravaldised kirjeldavad tรคhemรคrkide vahemikke, alternatiive, kordusi ja sรตnade positsioone รผhes mustris.

Kui eesmรคrk on paika pandud, tutvustatakse jรคrgmises osas sรผntaksit, mida kasutate igas regulaaravaldise pรคringus.

REGEXP-i pรตhisรผntaks

Regulaaravaldise pรตhisรผntaks on jรคrgmine.

SELECT * FROM table_name
WHERE fieldname REGEXP 'pattern';

SIIN:

  • โ€žSELECT-lauseโ€ on standard SELECT avaldus.
  • โ€žWHERE vรคljanimiโ€ on veeru nimi, millel regulaaravaldist teostatakse.
  • "REGEXP muster" โ€” REGEXP on regulaaravaldise operaator ja 'pattern' tรคhistab mustrit, millele vastet otsitakse. RLIKE on REGEXP sรผnonรผรผm ja tagastab samad tulemused. Selleks, et vรคltida segiminekut LIKE operaatoriga, on parem kasutada REGEXP-i.

Vaatame nรผรผd praktilist nรคidet.

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

รœlaltoodud pรคring otsib kรตiki filmipealkirju, mis sisaldavad sรตna โ€žkoodโ€. Pole vahet, kas โ€žkoodโ€ asub pealkirja alguses, keskel vรตi lรตpus. Seni kuni pealkiri sisaldab mustrit, tagastatakse rida.

Vรครคrtuse alguse sobitamine mรคrkide loendiga

Oletame, et me tahame filme, mille pealkirjad algavad tรคhega a, b, c vรตi d, millele jรคrgneb mis tahes arv teisi mรคrke. Selle tulemuse saavutamiseks รผhendame mรคrkide loendi kaugemal asuva metamรคrgiga.

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

รœlaltoodud skripti kรคivitamine MySQL Workbench myflixdb andmebaasi vastuvรตtmine annab meile jรคrgmised tulemused.

filmi_id pealkiri juhataja aasta_vรคlja antud kategooria_id
4 Code Nimi Must Edgar Jimz 2010 NULL
5 Isa vรคikesed tรผdrukud NULL 2007 8
6 Inglid ja deemonid NULL 2007 6
7 davinci Code NULL 2007 6

Mustris '^[abcd]' nรตuab kaar (^), et vaste algaks vรครคrtuse algusest, ja mรคrgiloend [abcd] aktsepteerib ainult pealkirju, mille esimene tรคht on a, b, c vรตi d. Vaikimisi jรคrjestuse korral ei ole vรตrdlus tรตstutundlik, mistรตttu โ€žCode โ€žNimi Mustโ€ tagastatakse.

Tรคhemรคrkide loendi eitamine negatiivsete mรคrkide loendiga

Muudame nรผรผd skripti ja eitame mรคrgiloendit, et nรคha, millised read tagastatakse.

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

รœlaltoodud skripti kรคivitamine MySQL Workbenchi vรตrdlus myflixdb andmebaasiga annab meile jรคrgmised tulemused.

filmi_id pealkiri juhataja aasta_vรคlja antud kategooria_id
1 Kariibi mere piraadid 4 Rob Marshall 2011 1
2 Unustades Sarah Marshali Nicholas stoller 2008 2
3 X-Men 2008
9 Honey moontv John Schultz 2005 8
16 67% sรผรผdi 2012
17 Suur Diktaator Chalie Chaplie 1920 7
18 nรคidisfilm anonรผรผmne 8
19 film 3 John Brown 1920 8

Mรคrgiloendi sees muudab kursormรคrk tรคhendust: '^[^abcd]' ankurdab vaste endiselt algusesse, samas kui [^abcd] vรคlistab nรผรผd kรตik pealkirjad, mis algavad รผhe lisatud tรคhemรคrgiga.

Need kaks nรคidet kasutavad ainult ankrumรคrke ja mรคrgiloendeid. Jรคrgmises osas kรคsitletakse kogu metamรคrkide komplekti.

Regulaaravaldise metamรคrgid

รœlaltoodud nรคited demonstreerivad regulaaravaldise kรตige lihtsamat vormi. Metamรคrgid vรตimaldavad mustriotsingut tรคpsustada: need vรคljendavad kordusi, alternatiive, vahemikke ja positsioone. Allolev tabel loetleb kรตik regulaaravaldise toetatud metamรคrgid. MySQL REGEXP operaator koos igaรผhe kohta parandatud nรคitega.

Char Kirjeldus Nรคide
* . tรคrn (*) vastab nullile (0) vรตi enamale eksemplarile รผksikmรคrk mis sellele eelneb. SELECT * FROM filmidest WHERE pealkiri REGEXP 'da*'; sobib tรคhega โ€ždโ€œ, millele jรคrgneb null vรตi enam โ€žaโ€œ tรคhemรคrki, seega Da Vinci Code ja โ€žIssi vรคikesed tรผdrukudโ€ kvalifitseeruvad. Kasutage โ€žda+โ€, kui tรคht โ€žaโ€ peab tegelikult esinema.
+ . pluss (+) vastab รผhele vรตi mitmele eelneva mรคrgi esinemisjuhule. SELECT * FROM `filmid` WHERE `pealkiri` REGEXP 'esm+'; annab kรตik filmid, mis sisaldavad sรตna โ€žmonโ€, millele jรคrgneb รผks vรตi mitu tรคhemรคrki โ€žnโ€. Nรคiteks Inglid ja deemonid.
? . kรผsimรคrk (?) vastab nullile (0) vรตi รผhele eelneva mรคrgi esinemisjuhule. SELECT * FROM `kategooriad` WHERE `kategooria_nimi` REGEXP 'com?'; vastet โ€žcoโ€œ-le lisab valikuline โ€žmโ€œ. Nรคiteks komรถรถdia ja romantiline komรถรถdia.
. . punkt (.) sobib mis tahes รผksiku tรคhemรคrgiga, vรคlja arvatud uus rida. SELECT * FROM filmidest WHERE `aasta_vรคlja antud` REGEXP '200.'; Kuvab kรตik filmid, mis ilmusid aastal, alustades numbriga โ€ž200โ€œ, millele jรคrgneb suvaline tegelane. Nรคiteks 2005, 2007, 2008.
[ABC] . mรคrkide loend [abc] sobib รผkskรตik millise lisatud tรคhemรคrgiga. SELECT * FROM `filmid` WHERE `pealkiri` REGEXP '[vwxyz]'; annab kรตik filmid, mis sisaldavad รผkskรตik millist tegelast filmist โ€žvwxyzโ€. Nรคiteks X-Mehed ja Da Vinci Code.
[^abc] . eitatud loend [^abc] sobib mis tahes tรคhemรคrgiga, vรคlja arvatud need, mis on lisatud. SELECT * FROM `filmidest` WHERE `pealkiri` REGEXP '^[^vwxyz]'; annab kรตik filmid, mille pealkiri ei alga tรคhemรคrgiga sรตnas โ€žvwxyzโ€.
[AZ] . vahemik [AZ] sobib mis tahes suurtรคhega. SELECT * FROM `liikmed` WHERE `postiaadress` REGEXP '[AZ]'; annab kรตigile liikmetele, kelle postiaadress sisaldab tรคhte A ja Z vahel. Nรคiteks Janet Jones liikmenumbriga 1.
[az] . vahemik [az] sobib mis tahes vรคiketรคhega. SELECT * FROM `liikmed` WHERE `postiaadress` REGEXP '[az]'; annab kรตigile liikmetele, kelle postiaadress sisaldab tรคhte a ja z vahel. Pane tรคhele, et vaikimisi sortimine ei ole suur- ega vรคiketรคhtede suhtes tundliku, seega sobib see vahemik ka suurtรคhtedega.
[0-9] . vahemik [0โ€“9] sobib mis tahes numbriga vahemikus 0 kuni 9. SELECT * FROM `liikmed` WHERE `kontaktnumber` REGEXP '[0-9]'; annab kรตigile liikmetele, kelle kontaktnumbris on vรคhemalt รผks number. Nรคiteks Robert Phil.
^ . hoop (^) ankurdab vaste vรครคrtuse algusesse. SELECT * FROM `filmidest` WHERE `pealkiri` REGEXP '^[cd]'; annab kรตik filmid, mille pealkiri algab tรคhega โ€žcโ€œ vรตi โ€ždโ€œ. Nรคiteks Code Nimi Must, Issi vรคikesed tรผdrukud ja Da Vinci Code.
$ . dollari mรคrk ($) ankurdab vaste vรครคrtuse lรตppu. SELECT * FROM `filmid` WHERE `pealkiri` REGEXP 'kood$'; annab kรตik filmid, mille pealkiri lรตpeb sรตnaga โ€žkoodโ€. Nรคiteks Davinci Code.
| . vertikaalne riba (|) isoleerib alternatiive. SELECT * FROM `filmidest` WHERE `pealkiri` REGEXP '^[cd]|^[u]'; annab kรตik filmid, mille pealkiri algab tรคhega โ€žcโ€œ, โ€ždโ€œ vรตi โ€žuโ€œ. Nรคiteks Code Nimi Must, Da Vinci Codeja allilma โ€“ Awakening.
\b . sรตnapiir (\b) sobib sรตna alguse vรตi lรตpuga. See asendab vanemaid [[:<:]] ja [[:>:]] markereid, mis MySQL 8.0 eemaldatud. SELECT * FROM `filmid` WHERE `pealkiri` REGEXP '\\bfor'; annab kรตik filmid, mille sรตna algab sรตnaga โ€žforโ€œ. Nรคiteks โ€žUnusta Sarah Marshaliโ€œ. MySQL 5.7 samavรครคrne muster on '[[:<:]]for'.
[[:klass:]] . iseloomu klass vastet leiab nimetatud tรคhemรคrkide rรผhma: [[:alpha:]] tรคhtede, [[:space:]] tรผhiku, [[:punct:]] kirjavahemรคrkide ja [[:upper:]] suurtรคhtede korral. Pange tรคhele, et kahekordistada nurksulud. SELECT * FROM `filmid` WHERE `pealkiri` REGEXP '^[[:alpha:][:tรผhik:]]+$'; annab kรตik filmid, mille pealkiri sisaldab ainult tรคhti ja tรผhikuid. Nรคiteks "Forgetting Sarah Marshal", samas kui "Pirates of the Caribbean 4" on numbri tรตttu vรคlja jรคetud.

Tagasikaldkriips (\) on pรตgenemismรคrk. Sest MySQL parsib esmalt stringi ja seejรคrel mustrit, tuleb literaalne tagurpidi kaldkriips kirjutada topelt tagurpidi kaldkriipsuna (\\) regulaaravaldise mustri sees.

โš ๏ธ Versioonihoiatus: MySQL Versioonis 8.0.4 asendati vana regulaaravaldiste mootor ICU teegiga. Selles versioonis eemaldati sรตnamarkerid [[:<:]] ja [[:>:]], seega vanemast materjalist kopeeritud mustrid ebaรตnnestuvad ja annavad "sรผntaksivea". MySQL 8.0. Kasuta selle asemel \b.

Nรผรผd, kui iga metamรคrk on defineeritud, tekib รตiglane kรผsimus: millal peaks REGEXP asendama lihtsama LIKE operaatori?

REGEXP vs LIKE: kumba peaksite kasutama?

Mรตlemad operaatorid filtreerivad ridu mustri jรคrgi, kuid lahendavad erinevaid probleeme. LIKE mรตistab ainult kahte sรผmbolit, samas kui REGEXP mรตistab kogu รผlaltoodud metamรคrkide komplekti. Sellel vรตimekusel on oma hind, seega on valik pigem kompromiss kui eelistus.

Kriteerium SAMASUGUNE REGULAARNE AVALDUS
Mustri sรผmbolid Ainult % ja _ Anchors, vahemikud, vaheldumine, kvantorid, mรคrgiklassid
Tรผรผpiline kasutamine Eesliite, jรคrelliite ja โ€žsisaldabโ€ otsingud Valideerimine, mitu alternatiivi, positsiooniteadlik sobitamine
Indeksi kasutamine Vรตimalik, kui muster ei alga %-mรคrgiga Ei kasuta kunagi indeksit
Tagastusvรครคrtus Tร•ENE vรตi Vร„ร„R 1 vรตi 0 ja NULL, kui kumbki operand on NULL

Lihtsa vaste leidmiseks vali LIKE, kuna see loeb hรคsti ja saab ikkagi indeksit kasutada. Vali REGEXP, kui รผks muster peab korraga vรคljendama mitut reeglit, nรคiteks โ€žalgab c vรตi d-ga ja lรตpeb numbrigaโ€œ. Suurtes tabelites kitsenda ridu esmalt indekseeritud tingimusega ja seejรคrel rakenda REGEXP-i sellele vรคiksemale hulgale.

MySQL 8.0 regulaaravaldise funktsioonid

REGEXP operaator vastab ainult รผhele kรผsimusele: kas vรครคrtus vastab mustrile? MySQL 8.0 lisas neli funktsiooni, mis lรคhevad kaugemale ja vรตimaldavad teil leida nt.tract ja kirjutage sobiv tekst รผmber. Igaรผks neist aktsepteerib valikulist match_type argumenti, kus 'c' sunnib kasutama tรตstutundlikku vรตrdlust ja 'i' sunnib kasutama tรตstutundlikku vรตrdlust.

  • REGEXP_LIKE(avaldis, muster) tagastab 1, kui vรครคrtus vastab mustrile. See on REGEXP operaatori funktsioonivorm ja argument match_type muudab tรตstu- ja vรคiketรคhtede eristavaks.
  • REGEXP_INSTR(avaldis, muster) tagastab vaste esimese mรคrgi positsiooni vรตi 0, kui mustrit ei leitud.
  • REGEXP_SUBSTR(avaldis, muster) tagastab sobiva alamstringi enda, mis on kasulik aasta, koodi vรตi numbri pikemast tekstivรครคrtusest vรคljavรตtmiseks.
  • REGEXP_REPLACE(avaldis, muster, asendus) tagastab vรครคrtuse iga asendatud vastega, seega saab andmeid puhastada SQL UPDATE pรคring.
SELECT title,
       REGEXP_SUBSTR(title, '[0-9]+') AS number_in_title
FROM `movies`
WHERE REGEXP_LIKE(title, '[0-9]');

รœlaltoodud pรคring tagastab iga filmi pealkirja, mis sisaldab numbrit, koos numbrite endiga. MySQL 5.7 pole need funktsioonid saadaval, seega jรครคb REGEXP operaator ainsaks valikuks.

KKK

Vaikimisi mitte. REGEXP jรคrgib veeru jรคrjestust ja standardsed jรคrjestused ei ole tรตstutundlikud. Lisage mรคrksรตna BINARY enne veergu vรตi kutsuge REGEXP_LIKE funktsiooni vaste tรผรผbiga 'c', et sundida vรตrdlust toimima tรตstutundlikult.

Funktsionaalset erinevust pole. RLIKE on regulaaravaldise sรผnonรผรผm, mis MySQL รœhilduvuse huvides sรคilitatakse. Praktikas eelistatakse regulaaravaldist, kuna RLIKE-d aetakse kergesti segi omavahel mitteseotud LIKE-operaator kasutatakse metamรคrkide jaoks.

REGEXP ei saa indeksit kasutada, seega MySQL hindab mustrit rida-realt. Vรคhendage esmalt skannitud ridu indekseeritud tingimuse, kuupรคevavahemiku vรตi tรคistekstiindeksiga ja rakendage regulaaravaldist sellele vรคiksemale tulemuste hulgale.

Jah. Tehisintellekti assistendid teisendavad lihtkeele reegli regulaaravaldise mustriks ja selgitavad iga metamรคrki. Testi tulemust MySQL Workbench nรคidisridade suhtes, sest รผks valesti paigutatud ankur muudab kogu tulemuste komplekti.

Jah. Tehisintellekti assistendid genereerivad REGEXP_REPLACE lauseid, mis eemaldavad kirjavahemรคrgid, normaliseerivad telefoninumbreid vรตi eemaldavad tรผhikuid. Kรคivitage muster esmalt SELECT-i sees, kinnitage รผmberkirjutatud vรครคrtused ja alles seejรคrel rakendage seda Vร„RSKENDA avaldus.

Vรตta see postitus kokku jรคrgmiselt: