MySQL Expressions régulières (Regexp)

⚡ Résumé intelligent

MySQL Les expressions régulières (REGEXP) permettent de comparer les valeurs des colonnes à des modèles flexibles que les caractères génériques ne peuvent pas exprimer. Ce document explique la syntaxe des expressions régulières, le synonyme RLIKE, tous les métacaractères pris en charge, des exemples de requêtes corrigées sur la base de données myflixdb et les fonctions d'expressions régulières ajoutées. MySQL 8.0.

  • 🔍 Core Operator: REGEXP compare une colonne à un modèle et renvoie 1 en cas de correspondance, tandis que RLIKE est un synonyme exact de REGEXP.
  • 🧩 Patron de Couture Anchors: Le symbole accent circonflexe (^) ancre la correspondance au début de la valeur, et le signe dollar ($) l'ancre à la fin.
  • 🔤 Listes de personnages : [abcd] correspond à n'importe quel caractère inclus, et [^abcd] exclut tous les caractères inclus de l'ensemble de résultats.
  • Quantificateurs : L'astérisque, le plus et le point d'interrogation s'appliquent au caractère qui les précède, et non à la chaîne entière.
  • 🛡️ appâtping Règle: Une barre oblique inverse littérale doit être doublée à l'intérieur d'un motif, car MySQL traite la chaîne deux fois.
  • (I.e. Changement de version : MySQL La version 8.0 a été déplacée vers le moteur ICU, a remplacé [[:<:]] et [[:>:]] par \b et a ajouté REGEXP_LIKE, REGEXP_REPLACE, REGEXP_SUBSTR et REGEXP_INSTR.
  • | Remarque sur les performances : REGEXP n'utilise jamais d'index ; il faut donc filtrer les lignes avec une condition indexée en premier lieu chaque fois que la requête le permet.

Quels sont MySQL expressions régulières ?

MySQL expressions régulières Elle vous aide à rechercher des données correspondant à des critères complexes. Une expression régulière est un modèle qui décrit la forme de la valeur recherchée, et non la valeur elle-même.

Si vous avez déjà travaillé avec MySQL caractères génériquesVous vous demandez peut-être pourquoi il est utile d'apprendre les expressions régulières alors que LIKE produit des résultats similaires. La réponse réside dans leur puissance expressive : les caractères génériques n'offrent que deux symboles, tandis que les expressions régulières décrivent des plages de caractères, des alternatives, des répétitions et des positions de mots dans un seul motif.

L’objectif étant défini, la section suivante présente la syntaxe que vous utiliserez dans chaque requête REGEXP.

Syntaxe de base des expressions régulières

La syntaxe de base d'une expression régulière est la suivante.

SELECT * FROM table_name
WHERE fieldname REGEXP 'pattern';

ICI:

  • « Instruction SELECT » est la norme Instruction SELECT.
  • « OÙ nom du champ » est le nom de la colonne sur laquelle l'expression régulière est appliquée.
  • « Modèle » REGEXP » — REGEXP est l'opérateur d'expression régulière, et « modèle » représente le modèle à faire correspondre. RLIKE est une synonyme de REGEXP et renvoie les mêmes résultats. Pour éviter toute confusion avec l'opérateur LIKE, il est préférable d'utiliser REGEXP.

Examinons maintenant un exemple pratique.

SELECT * FROM `movies`
WHERE `title` REGEXP 'code';

La requête ci-dessus recherche tous les titres de films contenant le mot « code ». La position de « code » dans le titre (début, milieu ou fin) n'a pas d'importance. Dès lors que le titre contient ce motif, la ligne correspondante est renvoyée.

Faire correspondre le début d'une valeur à une liste de caractères

Supposons que nous souhaitions obtenir les films dont le titre commence par a, b, c ou d, suivi d'un nombre quelconque d'autres caractères. Pour ce faire, nous combinons une liste de caractères avec le métacaractère caret.

SELECT * FROM `movies`
WHERE `title` REGEXP '^[abcd]';

Exécuter le script ci-dessus dans MySQL Workbench La recherche sur la base de données myflixdb nous donne les résultats suivants.

id_film titre Directeur année_sortie id_catégorie
4 Code Nom Noir Edgar Jimz 2010 NULL
5 Les petites filles à papa NULL 2007 8
6 anges et démons NULL 2007 6
7 Da Vinci Code NULL 2007 6

Dans le modèle '^[abcd]', le symbole accent circonflexe (^) exige que la correspondance commence au début de la valeur, et la liste de caractères [abcd] n'accepte que les titres dont la première lettre est a, b, c ou d. La comparaison n'est pas sensible à la casse avec le classement par défaut, c'est pourquoi «Code Le nom « Black » est renvoyé.

Exclure les personnages ayant une liste de caractères négative

Modifions maintenant le script et inversons la liste de caractères pour voir quelles lignes sont renvoyées.

SELECT * FROM `movies`
WHERE `title` REGEXP '^[^abcd]';

Exécuter le script ci-dessus dans MySQL L'exécution de Workbench sur la base de données myflixdb nous donne les résultats suivants.

id_film titre Directeur année_sortie id_catégorie
1 Pirates des Caraïbes 4 Rob Marshall 2011 1
2 Oublier Sarah Marshal Nicolas Stoller 2008 2
3 X Men 2008
9 Honey moonERS Jean Schultz 2005 8
16 67% Coupable 2012
17 Le Dictateur Chalie Chaplie 1920 7
18 extrait de film Témoignages 8
19 film 3 John Brown 1920 8

Dans une liste de caractères, le symbole caret change de signification : '^[^abcd]' ancre toujours la correspondance au début, tandis que [^abcd] exclut désormais tous les titres qui commencent par l'un des caractères inclus.

Ces deux exemples n'utilisent que des ancres et des listes de caractères. La section suivante aborde l'ensemble complet des métacaractères.

Métacaractères d'expression régulière

Les exemples ci-dessus illustrent la forme la plus simple d'une expression régulière. Les métacaractères permettent d'affiner la recherche d'un motif : ils expriment la répétition, les alternatives, les plages et les positions. Le tableau ci-dessous répertorie tous les métacaractères pris en charge. MySQL Opérateur REGEXP, avec un exemple corrigé pour chacun.

Carboniser Description Exemple
* Le astérisque (*) correspond à zéro (0) ou plusieurs occurrences de caractère unique qui le précède. SELECT * FROM films WHERE titre REGEXP 'da*'; correspond à un « d » suivi de zéro ou plusieurs caractères « a », donc Da Vinci Code et Daddy's Little Girls entrent en ligne de compte. Utilisez « da+ » lorsque la lettre « a » doit être présente.
+ Le plus (+) correspond à une ou plusieurs occurrences du caractère qui le précède. SELECT * FROM `films` WHERE `titre` REGEXP 'mon+'; Affiche tous les films contenant « mon » suivi d'un ou plusieurs caractères « n ». Par exemple, Anges et Démons.
? Le point d'interrogation (?) correspond à zéro (0) ou à une occurrence du caractère qui le précède. SELECT * FROM `categories` WHERE `category_name` REGEXP 'com?'; Associe « co » à un « m » optionnel. Par exemple, comédie et comédie romantique.
. Le point (.) correspond à n'importe quel caractère unique, sauf un saut de ligne. SELECT * FROM films WHERE `year_released` REGEXP '200.'; Affiche tous les films sortis au cours d'une année commençant par « 200 », suivi d'un seul chiffre. Par exemple : 2005, 2007, 2008.
[abc] Le liste des personnages [abc] correspond à l'un des caractères inclus. SELECT * FROM `films` WHERE `titre` REGEXP '[vwxyz]'; donne tous les films contenant au moins un personnage de « vwxyz ». Par exemple, X-Men et Da Vinci Code.
[^ abc] Le liste négative [^abc] Correspond à n'importe quel caractère sauf ceux entre parenthèses. SELECT * FROM `films` WHERE `titre` REGEXP '^[^vwxyz]'; donne tous les films dont le titre ne commence pas par un caractère de « vwxyz ».
[AZ] Le gamme [AZ] correspond à n'importe quelle lettre majuscule. SELECT * FROM `membres` WHERE `adresse_postale` REGEXP '[AZ]'; Cette liste répertorie tous les membres dont l'adresse postale contient une lettre comprise entre A et Z. Par exemple, Janet Jones, numéro de membre 1.
[az] Le gamme [az] correspond à n'importe quelle lettre minuscule. SELECT * FROM `membres` WHERE `adresse_postale` REGEXP '[az]'; Affiche la liste des membres dont l'adresse postale contient une lettre comprise entre a et z. Notez que le classement par défaut n'est pas sensible à la casse ; cette plage inclut donc également les lettres majuscules.
[0-9] Le plage [0-9] correspond à n'importe quel chiffre de 0 à 9. SELECT * FROM `members` WHERE `contact_number` REGEXP '[0-9]'; donne à tous les membres dont le numéro de téléphone contient au moins un chiffre. Par exemple, Robert Phil.
^ Le curseur (^) ancre la correspondance au début de la valeur. SELECT * FROM `films` WHERE `titre` REGEXP '^[cd]'; donne tous les films dont le titre commence par « c » ou « d ». Par exemple, Code Nom Black, les petites filles de papa et Da Vinci Code.
$ Le signe dollar ($) ancre la correspondance à la fin de la valeur. SELECT * FROM `movies` WHERE `title` REGEXP 'code$'; donne tous les films dont le titre se termine par « code ». Par exemple, Da Vinci Code.
| Le barre verticale (|) isole les alternatives. SELECT * FROM `films` WHERE `titre` REGEXP '^[cd]|^[u]'; donne tous les films dont le titre commence par « c », « d » ou « u ». Par exemple, Code Nom Noir, Da Vinci Codeet le monde souterrain – AwakenING.
\b Le limite de mot (\b) Il marque le début ou la fin d'un mot. Il remplace les anciens marqueurs [[:<:]] et [[:>:]], qui MySQL Version 8.0 supprimée. SELECT * FROM `movies` WHERE `title` REGEXP '\\bfor'; donne tous les films dont le nom commence par « for ». Par exemple, Forgetting Sarah Marshall. MySQL 5.7 le modèle équivalent est '[[:<:]]for'.
[[:classe:]] Le classe de caractères correspond à un groupe de caractères nommé : [[:alpha:]] pour les lettres, [[:space:]] pour les espaces, [[:punct:]] pour la ponctuation et [[:upper:]] pour les majuscules. Notez le double crochets. SELECT * FROM `movies` WHERE `title` REGEXP '^[[:alpha:][:space:]]+$'; Affiche tous les films dont le titre ne contient que des lettres et des espaces. Par exemple, « Forgetting Sarah Marshall », tandis que « Pirates des Caraïbes 4 » est omis à cause du chiffre.

La barre oblique inverse (\) est le caractère d'échappement. MySQL analyse d'abord la chaîne et ensuite le modèle, une barre oblique inverse littérale doit être écrite comme une double barre oblique inverse (\\) à l'intérieur d'un modèle REGEXP.

⚠️ Avertissement concernant la version : MySQL La version 8.0.4 a remplacé l'ancien moteur d'expressions régulières par la bibliothèque ICU. Les marqueurs de mots [[:<:]] et [[:>:]] ont été supprimés dans cette version ; par conséquent, les modèles copiés à partir d'éléments plus anciens génèrent une erreur de syntaxe. MySQL 8.0. Utilisez plutôt \b.

Maintenant que chaque métacaractère est défini, une question légitime se pose : quand REGEXP devrait-il remplacer l’opérateur LIKE, plus simple ?

REGEXP ou LIKE : lequel utiliser ?

Ces deux opérateurs filtrent les lignes selon un motif, mais ils résolvent des problèmes différents. LIKE ne reconnaît que deux symboles, tandis que REGEXP reconnaît l'ensemble des métacaractères présentés ci-dessus. Cette capacité a un coût ; le choix s'apparente donc à un compromis plutôt qu'à une préférence.

Critère COMME REGEXP
symboles de motifs % et _ seulement Anchors, plages, alternance, quantificateurs, classes de caractères
Utilisation typique Recherche par préfixe, suffixe et « contient » Validation, alternatives multiples, appariement tenant compte de la position
Utilisation de l'index Possible lorsque le motif ne commence pas par % N'utilise jamais d'index
Valeur de retour VRAI ou FAUX 1 ou 0, et NULL si l'un des opérandes est NULL.

Utilisez LIKE pour une correspondance simple, car son rendu est clair et il peut utiliser un index. Choisissez REGEXP lorsqu'un seul modèle doit exprimer plusieurs règles simultanément, comme « commence par c ou d et se termine par un chiffre ». Pour les grands tableaux, commencez par filtrer les lignes à l'aide d'une condition indexée, puis appliquez REGEXP à cet ensemble réduit.

MySQL 8.0 Fonctions d'expressions régulières

L'opérateur REGEXP ne répond qu'à une seule question : la valeur correspond-elle au modèle ? MySQL La version 8.0 a ajouté quatre fonctions qui vont plus loin et vous permettent de localiser, par exempletract, et réécrivez le texte correspondant. Chacune accepte un argument optionnel match_type, où 'c' force une comparaison sensible à la casse et 'i' force une comparaison insensible à la casse.

  • REGEXP_LIKE(expr, motif) Renvoie 1 lorsque la valeur correspond au modèle. Il s'agit de la forme fonctionnelle de l'opérateur REGEXP, et l'argument match_type spécifie la sensibilité à la casse.
  • REGEXP_INSTR(expr, motif) renvoie la position du premier caractère de la correspondance, ou 0 si le modèle est introuvable.
  • REGEXP_SUBSTR(expr, motif) renvoie la sous-chaîne correspondante, ce qui est utile pour extraire une année, un code ou un nombre d'une valeur textuelle plus longue.
  • REGEXP_REPLACE(expr, motif, remplacement) renvoie la valeur après remplacement de chaque correspondance, ce qui permet de nettoyer les données à l'intérieur d'un Requête SQL UPDATE.
SELECT title,
       REGEXP_SUBSTR(title, '[0-9]+') AS number_in_title
FROM `movies`
WHERE REGEXP_LIKE(title, '[0-9]');

La requête ci-dessus renvoie tous les titres de films contenant un chiffre, ainsi que les chiffres eux-mêmes. MySQL 5.7 Ces fonctions ne sont pas disponibles, l'opérateur REGEXP reste donc la seule option.

FAQ

Non, ce n'est pas le comportement par défaut. REGEXP suit le classement de la colonne, et les classements standard ne tiennent pas compte de la casse. Pour forcer une comparaison sensible à la casse, ajoutez le mot-clé BINARY avant la colonne ou appelez REGEXP_LIKE avec le type de correspondance « c ».

Il n'y a aucune différence fonctionnelle. RLIKE est un synonyme de REGEXP. MySQL Pour des raisons de compatibilité, l'utilisation de REGEXP est privilégiée en pratique, car RLIKE peut facilement être confondu avec des expressions sans rapport. LIKE opérateur utilisé pour les caractères génériques.

REGEXP ne peut pas utiliser d'index, donc MySQL Évalue le modèle ligne par ligne. Réduisez d'abord le nombre de lignes analysées à l'aide d'une condition indexée, d'une plage de dates ou d'un index de texte intégral, puis appliquez l'expression régulière à cet ensemble de résultats réduit.

Oui. Les assistants IA convertissent une règle en langage clair en une expression régulière et expliquent chaque métacaractère. Testez le résultat dans MySQL Workbench par rapport aux lignes d'exemple, car une seule ancre mal placée modifie l'ensemble des résultats.

Oui. Les assistants IA génèrent des instructions REGEXP_REPLACE qui suppriment la ponctuation, normalisent les numéros de téléphone ou suppriment les espaces superflus. Exécutez d'abord le modèle dans une instruction SELECT, vérifiez les valeurs réécrites, puis appliquez-le seulement dans une instruction. Instruction UPDATE.

Résumez cet article avec :