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.

