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.

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.
