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.

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.
