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.

  • 🔍 Nucleu Operator: REGEXP compară o coloană cu un model și returnează 1 pentru o potrivire, în timp ce RLIKE este un sinonim exact al REGEXP.
  • 🧩 Model Anchors: Semnul circumflex (^) ancorează potrivirea la începutul valorii, iar semnul dolar ($) o ancorează la sfârșit.
  • 🔤 Liste de personaje: [abcd] se potrivește cu orice caracter inclus, iar [^abcd] exclude fiecare caracter inclus din setul de rezultate.
  • ➕ Cuantificatori: Asteriscul, semnul plus și semnul întrebării se aplică caracterului individual care le precede, nu întregului șir.
  • 🛡️ Escaping Regulă: O bară oblică inversată literală trebuie dublată în interiorul unui model, deoarece MySQL procesează șirul de două ori.
  • 🆕 Schimbare de versiune: MySQL Versiunea 8.0 a fost mutată pe motorul ICU, a înlocuit [[:<:]] și [[:>:]] cu \b și a adăugat REGEXP_LIKE, REGEXP_REPLACE, REGEXP_SUBSTR și REGEXP_INSTR.
  • ⚡ Notă de performanță: REGEXP nu folosește niciodată un index, așadar filtrați mai întâi rândurile cu o condiție indexată ori de câte ori interogarea o permite.

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.

Întrebări frecvente

Nu în mod implicit. REGEXP urmează aranjarea coloanei, iar aranjamentele standard nu țin cont de majuscule/minuscule. Adăugați cuvântul cheie BINARY înaintea coloanei sau apelați REGEXP_LIKE cu tipul de potrivire „c” pentru a forța o comparație ținând cont de majuscule/minuscule.

Nu există nicio diferență funcțională. RLIKE este un sinonim pentru REGEXP care MySQL se păstrează pentru compatibilitate. În practică se preferă REGEXP, deoarece RLIKE se confundă ușor cu cele fără legătură operator LIKE folosit pentru wildcard-uri.

REGEXP nu poate folosi un index, deci MySQL evaluează modelul rând cu rând. Reduceți mai întâi rândurile scanate cu o condiție indexată, un interval de date sau un index de text complet și aplicați expresia regulată acelui set de rezultate mai mic.

Da. Asistenții AI convertesc o regulă în limbaj simplu într-un model REGEXP și explică fiecare metacaracter. Testați rezultatul în MySQL Banc de lucru împotriva rândurilor eșantion, deoarece o singură ancoră plasată greșit modifică întregul set de rezultate.

Da. Asistenții inteligenți artificiali generează instrucțiuni REGEXP_REPLACE care elimină punctuația, normalizează numerele de telefon sau elimină spațiile rătăcite. Rulați mai întâi modelul în interiorul unui SELECT, confirmați valorile rescrise și abia apoi aplicați-l într-un Declarație UPDATE.

Rezumați această postare cu: