MySQL Expresii regulate (Regexp)
โก Rezumat inteligent
MySQL Expresiile regulate (REGEXP) potrivesc valorile coloanelor cu modele flexibile pe care wildcard-urile nu le pot exprima. Aceasta explicฤ sintaxa REGEXP, sinonimul RLIKE, fiecare metacaracter acceptat, exemple de interogare corectate รฎn baza de date myflixdb ศi funcศiile expresiilor regulate adฤugate รฎn MySQL 8.0.

Care sunt MySQL expresii regulate?
MySQL expresii obisnuite vฤ ajutฤ sฤ cฤutaศi date care corespund unor criterii complexe. O expresie regulatฤ este un model care descrie forma valorii pe care o cฤutaศi, mai degrabฤ decรขt valoarea รฎn sine.
Dacฤ aศi lucrat deja cu MySQL metacaractere, v-aศi putea รฎntreba de ce meritฤ รฎnvฤศate expresiile regulate cรขnd LIKE produce rezultate similare. Rฤspunsul este puterea expresivฤ: wildcard-urile oferฤ doar douฤ simboluri, รฎn timp ce expresiile regulate descriu intervale de caractere, alternative, repetiศii ศi poziศii ale cuvintelor รฎntr-un singur model.
Odatฤ stabilit scopul, urmฤtoarea secศiune prezintฤ sintaxa pe care o veศi utiliza รฎn fiecare interogare REGEXP.
Sintaxa de bazฤ a REGEXP
Sintaxa de bazฤ pentru o expresie regulatฤ este urmฤtoarea.
SELECT * FROM table_name WHERE fieldname REGEXP 'pattern';
AICI:
- โInstrucศiune SELECTโ este standardul instrucศiunea SELECT.
- โUNDE nume cรขmpโ este numele coloanei asupra cฤreia se executฤ expresia regulatฤ.
- โModelโ REGEXPโ โ REGEXP este operatorul expresiei regulate, iar โpatternโ reprezintฤ modelul care trebuie gฤsit. RLIKE este sinonim pentru REGEXP ศi returneazฤ aceleaศi rezultate. Pentru a evita confuzia cu operatorul LIKE, este mai bine sฤ utilizaศi REGEXP.
Sฤ luฤm acum รฎn considerare un exemplu practic.
SELECT * FROM `movies` WHERE `title` REGEXP 'code';
Interogarea de mai sus cautฤ toate titlurile filmelor care conศin cuvรขntul โcodeโ. Nu conteazฤ dacฤ โcodeโ apare la รฎnceputul, la mijlocul sau la sfรขrศitul titlului. Atรขta timp cรขt titlul conศine modelul, rรขndul este returnat.
Potrivirea รฎnceputului unei valori cu o listฤ de caractere
Sฤ presupunem cฤ dorim filmele ale cฤror titluri รฎncep cu a, b, c sau d, urmate de orice numฤr de alte caractere. Combinฤm o listฤ de caractere cu metacaracterul caret pentru a obศine acest rezultat.
SELECT * FROM `movies` WHERE `title` REGEXP '^[abcd]';
Executarea scriptului de mai sus รฎn MySQL Banc de lucru รฎmpotriva bazei de date myflixdb ne dฤ urmฤtoarele rezultate.
| movie_id | titlu | director | year_released | categorie_id |
|---|---|---|---|---|
| 4 | Code Nume Black | Edgar Jimz | 2010 | NULL |
| 5 | Fetiศele lui Tati | NULL | 2007 | 8 |
| 6 | ingeri si Demoni | NULL | 2007 | 6 |
| 7 | Da Vinci Code | NULL | 2007 | 6 |
รn modelul โ^[abcd]โ, semnul circumflex (^) necesitฤ ca potrivirea sฤ รฎnceapฤ de la รฎnceputul valorii, iar lista de caractere [abcd] acceptฤ doar titluri a cฤror primฤ literฤ este a, b, c sau d. Comparaศia nu este sensibilฤ la majuscule/minuscule รฎn cadrul colaศiunii implicite, motiv pentru care โCode Se returneazฤ โNume Blackโ.
Excluderea caracterelor cu o listฤ de caractere negatฤ
Sฤ modificฤm acum scriptul ศi sฤ negฤm lista de caractere pentru a vedea ce rรขnduri sunt returnate.
SELECT * FROM `movies` WHERE `title` REGEXP '^[^abcd]';
Executarea scriptului de mai sus รฎn MySQL Workbench-ul pentru baza de date myflixdb ne dฤ urmฤtoarele rezultate.
| movie_id | titlu | director | year_released | categorie_id |
|---|---|---|---|---|
| 1 | Piratii din Caraibe 4 | Rob Marshall | 2011 | 1 |
| 2 | Uitรขnd-o pe Sarah Marshal | Nicolae Stoller | 2008 | 2 |
| 3 | X-Men | 2008 | ||
| 9 | Honey mooners | John Schultz | 2005 | 8 |
| 16 | 67% vinovat | 2012 | ||
| 17 | The Great Dictator | Chalie Chaplie | 1920 | 7 |
| 18 | film exemplu | Anonim | 8 | |
| 19 | filmul 3 | John Brown | 1920 | 8 |
รn interiorul unei liste de caractere, semnul circumflex รฎศi schimbฤ sensul: โ^[^abcd]โ ancoreazฤ รฎn continuare potrivirea la รฎnceput, รฎn timp ce [^abcd] exclude acum fiecare titlu care รฎncepe cu unul dintre caracterele incluse.
Aceste douฤ exemple folosesc doar ancore ศi liste de caractere. Urmฤtoarea secศiune prezintฤ รฎntregul set de metacaractere.
Metacaracterele expresiei regulate
Exemplele de mai sus prezintฤ cea mai simplฤ formฤ a unei expresii regulate. Metacaracterele vฤ permit sฤ reglaศi fin cฤutarea unui model: acestea exprimฤ repetiศie, alternative, intervale ศi poziศii. Tabelul de mai jos listeazฤ fiecare metacaracter acceptat de MySQL Operatorul REGEXP, cu un exemplu corectat pentru fiecare.
| Mangal | Descriere | Exemplu | |
|---|---|---|---|
| * | asterisc (*) se potriveศte cu zero (0) sau mai multe instanศe ale un singur personaj care o precede. | SELECT * FROM filmele WHERE titlul REGEXP 'da*'; se potriveศte cu un โdโ urmat de zero sau mai multe caractere โaโ, deci Da Vinci Code ศi Daddy's Little Girls se calificฤ. Se foloseศte โda+โ atunci cรขnd litera โaโ trebuie sฤ fie prezentฤ. | |
| + | mai mult (+) se potriveศte cu una sau mai multe instanศe ale caracterului care รฎl precede. | SELECTAศI * FROM `movies` WHERE `title` REGEXP 'mon+'; afiศeazฤ toate filmele care conศin โmonโ urmat de unul sau mai multe caractere โnโ. De exemplu, รngeri ศi Demoni. | |
| ? | semnul รฎntrebฤrii (?) se potriveศte cu zero (0) sau cu o instanศฤ a caracterului care รฎl precede. | SELECT * FROM `categories` WHERE `category_name` REGEXP 'com?'; potriveศte โcoโ cu un โmโ opศional. De exemplu, comedie ศi comedie romanticฤ. | |
| . | punct (.) se potriveศte cu orice caracter, cu excepศia unei linii noi. | SELECT * FROM filmele WHERE `year_released` REGEXP '200.'; aratฤ toate filmele lansate รฎntr-un an, รฎncepรขnd cu โ200โ, urmate de orice caracter. De exemplu, 2005, 2007, 2008. | |
| [abc] | listฤ de caractere [abc] se potriveศte cu oricare dintre caracterele incluse. | SELECTAศI * DIN `filme` WHERE `titlu` REGEXP '[vwxyz]'; oferฤ toate filmele care conศin orice personaj din โvwxyzโ. De exemplu, X-Men ศi Da Vinci Code. | |
| [^abc] | listฤ negatฤ [^abc] se potriveศte cu orice caracter, cu excepศia celor incluse รฎn conศinut. | SELECTAศI * DIN `filme` WHERE `titlu` REGEXP '^[^vwxyz]'; prezintฤ toate filmele al cฤror titlu nu รฎncepe cu un caracter din โvwxyzโ. | |
| [AZ] | interval [AZ] se potriveศte cu orice literฤ majusculฤ. | SELECTAศI * FROM `membri` WHERE `adresa_poศtal` REGEXP '[AZ]'; le oferฤ tuturor membrilor a cฤror adresฤ poศtalฤ conศine o literฤ รฎntre A ศi Z. De exemplu, Janet Jones cu numฤrul de membru 1. | |
| [az] | interval [az] se potriveศte cu orice literฤ micฤ. | SELECT * FROM `membri` WHERE `adresa_postal` REGEXP '[az]'; oferฤ tuturor membrilor a cฤror adresฤ poศtalฤ conศine o literฤ รฎntre a ศi z. Reศineศi cฤ asamblarea implicitฤ nu ศine cont de majuscule/minuscule, deci acest interval corespunde ศi cu majuscule. | |
| [0-9] | interval [0-9] se potriveศte cu orice cifrฤ de la 0 la 9. | SELECT * FROM `membri` WHERE `numฤr_de_contact` REGEXP '[0-9]'; le oferฤ tuturor membrilor al cฤror numฤr de contact conศine cel puศin o cifrฤ. De exemplu, Robert Phil. | |
| ^ | accent (^) ancoreazฤ potrivirea la รฎnceputul valorii. | SELECTAศI * DIN `filme` WHERE `titlu` REGEXP '^[cd]'; afiศeazฤ toate filmele al cฤror titlu รฎncepe cu โcโ sau โdโ. De exemplu, Code Numele lui Black, fetiศele tatฤlui sฤu ศi Da Vinci Code. | |
| $ | semne de dolar ($) ancoreazฤ potrivirea la sfรขrศitul valorii. | SELECT * FROM `filme` WHERE `titlu` REGEXP 'cod$'; oferฤ toate filmele al cฤror titlu se terminฤ cu โcodโ. De exemplu, Da Vinci Code. | |
| | | barฤ verticalฤ (|) izoleazฤ alternativele. | SELECTAศI * DIN `filme` WHERE `titlu` REGEXP '^[cd]|^[u]'; afiศeazฤ toate filmele al cฤror titlu รฎncepe cu โcโ, โdโ sau โuโ. De exemplu, Code Numele Black, Da Vinci Codeศi Lumea de dincolo โ AwakenING. | |
| \b | limita de cuvรขnt (\b) se potriveศte cu รฎnceputul sau sfรขrศitul unui cuvรขnt. รnlocuieศte vechile marcaje [[:<:]] ศi [[:>:]], care MySQL 8.0 eliminat. | SELECT * FROM `filme` WHERE `titlu` REGEXP '\\bpentru'; prezintฤ toate filmele al cฤror cuvรขnt รฎncepe cu โpentruโ. De exemplu, Forgetting Sarah Marshal. Pe MySQL 5.7 modelul echivalent este โ[[:<:]]forโ. | |
| [[:clasฤ:]] | clasa de caractere se potriveศte cu un grup de caractere denumit: [[:alpha:]] pentru litere, [[:space:]] pentru spaศii albe, [[:punct:]] pentru punctuaศie ศi [[:upper:]] pentru litere majuscule. Reศineศi dubla paranteza patrata. | SELECT * FROM `filme` WHERE `titlu` REGEXP '^[[:alpha:][:spaศiu:]]+$'; afiศeazฤ toate filmele al cฤror titlu conศine doar litere ศi spaศii. De exemplu, Forgetting Sarah Marshal, รฎn timp ce Piraศii din Caraibe 4 este omis din cauza cifrei. | |
Barฤ oblicฤ inversatฤ (\) este caracterul de escape. Deoarece MySQL analizeazฤ mai รฎntรขi ศirul de caractere ศi apoi modelul, o barฤ oblicฤ inversatฤ literalฤ trebuie scrisฤ ca o barฤ oblicฤ inversatฤ dublฤ (\\) รฎn interiorul unui model REGEXP.
โ ๏ธ Avertisment privind versiunea: MySQL Versiunea 8.0.4 a รฎnlocuit vechiul motor de expresii regulate cu biblioteca ICU. Marcajele de cuvinte [[:<:]] ศi [[:>:]] au fost eliminate รฎn acea versiune, aศa cฤ modelele copiate din materiale mai vechi eศueazฤ cu o โeroare de sintaxฤโ pe MySQL 8.0. Foloseศte \b รฎn schimb.
Acum, cฤ fiecare metacaracter este definit, apare o รฎntrebare pertinentฤ: cรขnd ar trebui REGEXP sฤ รฎnlocuiascฤ operatorul LIKE mai simplu?
REGEXP vs LIKE: pe care ar trebui sฤ รฎl foloseศti?
Ambii operatori filtreazฤ rรขndurile dupฤ model, dar rezolvฤ probleme diferite. LIKE รฎnศelege doar douฤ simboluri, รฎn timp ce REGEXP รฎnศelege setul complet de metacaractere prezentat mai sus. Aceastฤ putere are un cost, deci alegerea este un compromis mai degrabฤ decรขt o preferinศฤ.
| Criteriu | SIMILAR | regexp |
|---|---|---|
| Simboluri de model | Doar % ศi _ | Anchors, intervale, alternanศฤ, cuantificatori, clase de caractere |
| Utilizare tipicฤ | Cฤutฤri dupฤ prefixe, sufixe ศi โconศineโ | Validare, alternative multiple, potrivire รฎn funcศie de poziศie |
| Utilizarea indexului | Posibil cรขnd modelul nu รฎncepe cu % | Nu foloseศte niciodatฤ un index |
| Valoare returnatฤ | Adevฤrat sau fals | 1 sau 0 ศi NULL cรขnd oricare dintre operanzi este NULL |
Alegeศi LIKE pentru o potrivire simplฤ, deoarece se citeศte bine ศi poate utiliza รฎn continuare un index. Alegeศi REGEXP atunci cรขnd un singur model trebuie sฤ exprime mai multe reguli simultan, cum ar fi โรฎncepe cu c sau d ศi se terminฤ cu o cifrฤโ. รn tabelele mari, restrรขngeศi mai รฎntรขi rรขndurile cu o condiศie indexatฤ, apoi aplicaศi REGEXP acelui set mai mic.
MySQL Funcศii de expresii regulate 8.0
Operatorul REGEXP rฤspunde la o singurฤ รฎntrebare: valoarea corespunde modelului? MySQL 8.0 a adฤugat patru funcศii care merg mai departe ศi vฤ permit sฤ localizaศi, de exemplutract ศi rescrieศi textul corespunzฤtor. Fiecare acceptฤ un argument opศional match_type, unde โcโ forศeazฤ o comparaศie sensibilฤ la majuscule/minuscule, iar โiโ forศeazฤ una insensibilฤ la majuscule/minuscule.
- REGEXP_LIKE(expr, model) returneazฤ 1 cรขnd valoarea se potriveศte cu modelul. Este forma funcศiei operatorului REGEXP, iar argumentul match_type explicitฤ sensibilitatea la majuscule/minuscule.
- REGEXP_INSTR(expresie, model) returneazฤ poziศia primului caracter al potrivirii sau 0 cรขnd modelul nu este gฤsit.
- REGEXP_SUBSTR(expresie, model) returneazฤ subศirul corespunzฤtor, ceea ce este util pentru extragerea unui an, a unui cod sau a unui numฤr dintr-o valoare text mai lungฤ.
- REGEXP_REPLACE(expresie, model, รฎnlocuire) returneazฤ valoarea cu fiecare potrivire รฎnlocuitฤ, astfel รฎncรขt sฤ poatฤ curฤศa datele dintr-un Interogare SQL UPDATE.
SELECT title, REGEXP_SUBSTR(title, '[0-9]+') AS number_in_title FROM `movies` WHERE REGEXP_LIKE(title, '[0-9]');
Interogarea de mai sus returneazฤ fiecare titlu de film care conศine o cifrฤ, รฎmpreunฤ cu cifrele รฎn sine. Activat MySQL รn versiunea 5.7 aceste funcศii nu sunt disponibile, aศadar operatorul REGEXP rฤmรขne singura opศiune.
