REGEXP / RLIKE în MySQL

Expresii regulate MySQL 5.0+ (motor ICU din 8.0.4)

Verifică dacă un text se potrivește cu o expresie regulată; mai puternic decât LIKE.

Sintaxă
expresie REGEXP tipar
expresie RLIKE tipar
expresie NOT REGEXP tipar

Ce face REGEXP / RLIKE

REGEXP returnează 1 dacă textul se potrivește cu tiparul și 0 dacă nu. RLIKE este sinonim, iar NOT REGEXP inversează rezultatul.

Spre deosebire de LIKE, tiparul se poate potrivi oriunde în text, nu trebuie să acopere tot textul. Folosește ^ pentru început și $ pentru sfârșit. Cu colația implicită, nu face diferența între litere mari și mici.

Parametri

Parametru Descriere
expresie Textul verificat.
tipar Expresia regulată (sintaxă ICU), ex. '^07[0-9]{8}$'.

Ce returnează

1, 0 sau NULL.

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

CREATE TABLE clienti (
  id INT PRIMARY KEY,
  nume VARCHAR(50),
  oras VARCHAR(30),
  email VARCHAR(100),
  telefon VARCHAR(20)
);

INSERT INTO clienti VALUES
  (1, 'Ana Pop', 'Iași', 'ana.pop@exemplu.ro', '0722-123-456'),
  (2, 'bogdan ionescu', 'Cluj-Napoca', 'bogdan@firma.ro', '0744 555 101'),
  (3, 'Cristina Marin', 'Brașov', 'cristina@exemplu.ro', '0733.222.909'),
  (4, 'Dan Stoica', 'Timișoara', NULL, '0755123123');

Exemplul 1: Numere de telefon scrise corect

SELECT nume, telefon,
       telefon REGEXP '^07[0-9]{8}$' AS format_corect
FROM clienti
ORDER BY id;

Rezultat

+----------------+--------------+---------------+
| nume           | telefon      | format_corect |
+----------------+--------------+---------------+
| Ana Pop        | 0722-123-456 |             0 |
| bogdan ionescu | 0744 555 101 |             0 |
| Cristina Marin | 0733.222.909 |             0 |
| Dan Stoica     | 0755123123   |             1 |
+----------------+--------------+---------------+

Exemplul 2: RLIKE și NOT REGEXP

SELECT nume FROM clienti WHERE oras RLIKE '^(Iași|Brașov)$'
UNION ALL
SELECT CONCAT('fără cratimă: ', nume) FROM clienti WHERE oras NOT REGEXP '-';

Rezultat

+---------------------------------+
| nume                            |
+---------------------------------+
| Ana Pop                         |
| Cristina Marin                  |
| fără cratimă: Ana Pop           |
| fără cratimă: Cristina Marin    |
| fără cratimă: Dan Stoica        |
+---------------------------------+

Greșeli frecvente

  • Uiți de ^ și $. telefon REGEXP '[0-9]{10}' acceptă și texte cu alte caractere înainte sau după cele 10 cifre.
  • Folosești REGEXP pe tabele mari în WHERE. Nu poate folosi indexuri, deci scanează toate rândurile.

Comenzi înrudite

  • REGEXP_LIKE(): Ca operatorul REGEXP, dar ca funcție, cu opțiuni (ex. diferența dintre majuscule).
  • REGEXP_REPLACE(): Înlocuiește bucățile de text care se potrivesc cu o expresie regulată.
  • LIKE: Caută texte după un model: începe cu, se termină cu, conține.