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: