Les plats clés
- Les expressions régulières (regex) sont un outil précieux pour les développeurs, utilisés pour des tâches telles que l'analyse des journaux, la validation de la soumission de formulaire et les opérations de recherche et de recherche. Comprendre comment construire et utiliser efficacement Regex peut améliorer considérablement la productivité et l'efficacité.
- La construction d'un bon regex implique de définir un scénario, d'élaborer un plan et de mettre en œuvre / test / refactoring. Il est important de comprendre les types de personnages autorisés, combien de fois un personnage doit apparaître et toutes les contraintes à suivre.
- Des exemples pratiques d'utilisation regex incluent la correspondance d'un mot de passe, une URL, une balise HTML spécifique et des mots dupliqués. Ces exemples démontrent l'utilisation des gammes de caractères, des affirmations, des conditions, des groupes et plus encore.
- Bien que Regex soit un outil puissant, il peut également être complexe et difficile à gérer. Par conséquent, il est parfois plus efficace d'utiliser plusieurs regex plus petits au lieu d'un grand. Passer attention aux captures de groupe peut également rendre les matchs plus utiles pour un traitement ultérieur.
Des expressions régulières sont souvent utilisées pour effectuer des recherches, remplacer les sous-chaînes et valider les données de chaîne. Cet article fournit des conseils, des astuces, des ressources et des étapes pour passer par des expressions régulières complexes.
Si vous n'avez pas les compétences de base à votre actif, vous pouvez apprendre Regex avec notre guide pour débutant. Aussi arcanes que les expressions régulières, il ne vous faudra pas longtemps pour apprendre les concepts.
Il existe de nombreux livres, articles, sites Web qui expliquent les expressions régulières, donc au lieu d'écrire une autre explication, je préférerais aller directement à des exemples plus pratiques:
- correspondant à un mot de passe
- correspondant à une URL
- correspondant à une balise HTML spécifique
- Mots dupliqués correspondants
Vous pouvez trouver une feuille de triche utile sur ce lien. Avec une multitude de ressources utiles, il y a aussi une vidéo de conférence par Lea Verou au bas de ce post - c'est un peu long, mais c'est excellent pour briser le regex.
comment construire un bon regex
Les expressions régulières sont souvent utilisées dans la routine quotidienne du développeur - analyse du log, validation de soumission de formulaire, recherche et remplacement, etc. C’est pourquoi chaque bon développeur devrait savoir comment les utiliser, mais quelle est la meilleure pratique pour construire un bon regex?
1. Définir un scénario
L'utilisation du langage naturel pour définir le problème vous donnera une meilleure idée de l'approche à utiliser. Les mots pourraient et doivent, utilisés dans une définition, utiles pour décrire les contraintes ou affirmations obligatoires.
Vous trouverez ci-dessous un exemple:
- La chaîne doit commencer par «H» et terminer par «O» (par exemple bonjour, halo).
- La chaîne pourrait être enveloppée entre parenthèses.
2. Élaborer un plan
Après avoir eu une bonne définition du problème, nous pouvons comprendre le type d'éléments impliqués dans notre expression régulière:
- Quels sont les types de caractères autorisés (mot, chiffre, nouvelle ligne, gamme,…)?
- Combien de fois un personnage doit-il apparaître (un ou plusieurs, une fois,…)?
- Y a-t-il des contraintes à suivre (optionnels, lookahead / derrière, if-then-else,…)?
3. Implémenter / tester / refactor
Il est très important d'avoir un environnement de test en temps réel pour tester et améliorer votre expression régulière. Il existe des sites Web comme regex101.com, regexr.com et debuggex.com qui fournissent certains des meilleurs environnements.
Pour améliorer l'efficacité du regex, vous pouvez essayer de répondre à certaines de ces questions supplémentaires:
- Les classes de caractères sont-elles correctement définies pour le domaine spécifique?
- Dois-je écrire plus de chaînes de test pour couvrir plus de cas d'utilisation?
- est-il possible de trouver et d'isoler certains problèmes et de les tester séparément?
- Dois-je refacter mon expression avec des sous-bassins, des groupes, des conditions, etc., pour le rendre plus petit, plus clair et plus flexible?
Exemples pratiques
Le but des exemples suivants n'est pas d'écrire une expression qui ne résoudra que le problème, mais d'écrire l'expression la plus efficace pour les cas d'utilisation spécifiques, en utilisant des éléments importants comme les plages de caractères, les affirmations, les conditions, les groupes, etc.
correspondant à un mot de passe

Scénario:
- 6 à 12 caractères de longueur
- doit avoir au moins une lettre majuscule
- doit avoir au moins une lettre en bas de cas
- doit avoir au moins un chiffre
- doit contenir d'autres caractères
Modèle:
^ (? =. * [a-z]) (? =. * [a-z]) (? =. * d). {6,12} $
Cette expression est basée sur plusieurs lookahead positifs (? = (Regex)). Le lookahead correspond à quelque chose suivi par le déclaré (regex). L'ordre des conditions n'affecte pas le résultat. Les expressions sombre sont très utiles lorsqu'il y a plusieurs conditions.
Nous pourrions également utiliser le lookahead négatif (?! (Regex)) pour exclure certaines gammes de caractères. Par exemple, je pourrais exclure le% avec (?!. * #).
Expliquons chaque modèle de l'expression ci-dessus:
- ^ affirme la position au début de la chaîne
- (? =. * [A-Z]) Lookaad positif, affirme que le regex. * [A-Z] peut être apparié:
- . * Correspond à n'importe quel caractère (sauf Newline) entre zéro et temps illimité
- [A-Z] correspond à un seul caractère dans la plage entre A et Z (Case sensible)
- (? =. * [A-Z]) Lookaad positif, affirme que le regex. * [A-Z] peut être apparié:
- . * Correspond à n'importe quel caractère (sauf Newline) entre zéro et temps illimité
- [A-Z] correspond à un seul caractère entre A et Z (sensible à la caisse)
- (? =. * D) Lookahead positif, affirme que le regex * dcan est apparié:
- . * Correspond à n'importe quel caractère (sauf Newline) entre zéro et temps illimité
- D correspond à un chiffre [0-9]
- . {6,12}correspond à n'importe quel personnage (sauf Newline) entre 6 et 12 fois
- $ affirme la position à la fin de la chaîne
URL correspondant

Scénario:
- doit commencer par http ou https ou ftp suivi de: //
- doit correspondre à un nom de domaine valide
- pourrait contenir une spécification de port (http://www.sitepoint.com:80)
- pourrait contenir un chiffre, une lettre, des points, des traits de gamme, des barres obligées, plusieurs fois
Modèle:
^ (http | https | ftp): [/] {2} ([a-za-z0-9-.]. [a-za-z] {2,4}) (: [0-9])? /? ([a-za-z0-9 -._?, '/ \ & amp;% $ # = ~] *)
Le premier scénario est assez facile à résoudre avec ^ (http | https | ftp): [/] {2}.
Pour correspondre au nom de domaine, nous devons garder à l'esprit que pour être valide, il ne peut contenir que des lettres, des chiffres, des traits d'union et des points. Dans mon exemple, j'ai limité le nombre de caractères après la ponctuation de 2 à 4, mais j'ai pu être étendu pour de nouveaux domaines comme .Rocks ou. CODES. Le nom de domaine est apparié par ([a-za-z0-9-.]. [A-za-z] {2,4}).
La spécification du port en option est appariée par le simple (: [0-9]) ?.
Une URL peut contenir plusieurs barres obliques et plusieurs caractères répétées plusieurs fois (voir RFC3986), cela est apparié en utilisant une gamme de caractères dans un groupe ([A-ZA-Z0-9 -._?, '/ \ & Amp;% $ # = ~] *).
Il est vraiment utile de correspondre à chaque élément important avec un groupe Capture (), car il ne renvoie que les matchs dont nous avons besoin. N'oubliez pas que certains personnages doivent être échappés.
Ci-dessous, chaque sous-piste a expliqué:
- ^ affirme la position au début de la chaîne
- Capturer Group (http | https | ftp), capture http ou https ou ftp
- : caractère échappé, correspond au personnage: littéralement
- [/] {2} correspond exactement à 2 fois le caractère échappé /
- Capture Group ([a-za-z0-9-.]. [A-za-z] {2,4}):
- [a-za-z0-9-.] Correspond à un caractère et illimité de temps dans la gamme entre a et z, a et z, 0 et 9, le caractère - littéralement et le caractère. littéralement
- . correspond au personnage. littéralement
- [a-za-z] {2,4}correspond à un seul caractère entre 2 et 4 fois entre A et Z ou A et Z (sensible à la caisse)
- Capture Group (: [0-9]) ?:
- Quantifier? correspond au groupe entre zéro ou plus de fois
- : correspond au personnage: littéralement
- [0-9] correspond à un seul caractère entre 0 et 9 une ou plusieurs fois
- /? correspond au caractère / littéralement zéro ou une fois
- Capture Group ([a-za-z0-9 -._?, '/ \ & Amp;% $ # = ~] *):
- [a-za-z0-9 -._?, '/ \ & Amp;% $ # = ~] * correspond à zéro et illimité un seul caractère dans la gamme A-Z, A-Z, 0-9, les caractères : -._?, '/ & amp;% $ # = ~.
correspondant à la balise HTML

Scénario:
- La balise de démarrage doit commencer par
- La balise de fin doit commencer par suivi d'un ou plusieurs caractères et de la fin avec>
- Nous devons faire correspondre le contenu à l'intérieur d'un élément de balise
Modèle:
(. *?) 1>
Faire correspondre la balise de démarrage et le contenu à l'intérieur, c'est assez facile avec Et (. *?), Mais dans le modèle ci-dessus, j'ai ajouté une chose utile: la référence à un groupe de capture.
Chaque groupe de capture défini par parenthèses () pourrait être référé à l'aide de son numéro de position, (premier) (deuxième) (troisième), ce qui permettra d'autres opérations.
L'expression ci-dessus pourrait être expliquée comme:
- Commencez par
- Capturez le nom de la balise
- suivi d'un ou plusieurs caractères
- Capturez le contenu à l'intérieur de la balise
- La balise de clôture doit être Nom de la balise capturée avant>
Incluant seulement deux groupes de capture dans l'expression, le nom de balise et le contenu renvoient une correspondance très claire, une liste de noms de balises avec du contenu connexe.
Crerions un peu plus profondément et expliquons les sous-bassins:
-
- Capturer Group ([W]) correspond à n'importe quel caractère de mot A-ZA-Z0-9_ une ou plusieurs fois
- . * Correspond à n'importe quel caractère (sauf newline) entre zéro ou plus de fois
- > correspond au personnage> littéralement
- Capturer Group (. *?), Correspond à n'importe quel personnage (sauf Newline), zéro et plus de fois
-
- / correspond au caractère / littéralement
- 1 correspond au même texte correspondant au premier groupe de capture: ([w])
- > correspond aux personnages> littéralement
Mots dupliqués correspondants

Scénario:
- Les mots sont séparés d'espace
- Nous devons correspondre à chaque duplication - non consécutive aussi
Modèle:
b (w) b (? =. * 1)
Cette expression régulière semble difficile mais utilise une partie du concept précédemment montré.
Le modèle présente le concept de limites des mots.
Une limite de mot B vérifie principalement les positions. Il correspond lorsqu'un personnage de mot (c'est-à-dire: ABCDE) est suivi d'un caractère sans mot (c'est-à-dire: - ~ ,!).
Vous trouverez ci-dessous quelques exemples d'utilisations de la limite des mots pour le rendre plus clair:
- Étant donné l'expression des expressions régulières sont géniales
- Les correspondances de motif Bareb sont
- Le motif w {3} b pourrait correspondre aux trois dernières lettres des mots: lar, ion, sont, ome
L'expression ci-dessus pourrait être expliquée comme:
- Faire correspondre à chaque caractère de mot suivi d'un personnage non mot (dans notre espace de cas)
- Vérifiez si le mot correspondant est déjà présent ou non
Ci-dessous, vous trouverez l'explication de chaque sous-modèle:
- b limite du mot
- Capturer Group ([W]) correspond à n'importe quel caractère de mot A-ZA-Z0-9_
- b limite du mot
- (? =. * 1) Lookahead positif affirme que les éléments suivants peuvent être appariés:
- . * Correspond à n'importe quel caractère (sauf newline)
- 1 correspond au même texte que le premier groupe de capture
L'expression aura plus de sens si nous renvoyons toutes les correspondances au lieu de ne retourner que la première. Voir la fonction PHP preg_match_all pour plus d'informations.
Réflexions finales
Les expressions régulières sont des épées à double tranchant. Plus il y a de complexité, plus il est difficile de résoudre le problème. C’est pourquoi, parfois, il est difficile de trouver une expression régulière qui correspondra à tous les cas, et il est préférable d’utiliser plusieurs petits regets à la place.
Avoir un bon scénario du problème pourrait être très utile et vous permettra de commencer à penser à la gamme de caractères, aux contraintes, aux assertions, aux répétitions, aux valeurs facultatives, etc. Prêter plus d'attention aux captures de groupe rendra les correspondances utiles pour un traitement ultérieur. N'hésitez pas à améliorer les expressions dans les exemples et faites-nous savoir comment vous faites!
Ressources utiles
Ci-dessous, vous pouvez trouver plus d'informations et de ressources pour aider vos compétences regexées à se développer.
N'hésitez pas à ajouter un commentaire à l'article si vous trouvez quelque chose d'utile qui n'est pas répertorié.
lea verou - / reg (exp) {2}Laide /: démystifiant les expressions régulières
https://www.youtube.com/watch?v=eklues9rvak
bibliothèques PHP
nom |
Description |
Excuse
Crée un expansx exceptionnel en utilisant des chaînes de méthodes lisibles par l'homme
MidiofluentRegex
Construit les expressions regex en utilisant des setters courants et des termes de langue anglaise comme ci-dessus
Hoaregex
Fournit des outils pour analyser l'expansion et générer des chaînes
Regex inverse
Étant donné une expression régulière générera une chaîne
sites Web
url |
Description |
regex101.com
Testeur Regex en ligne PCRE
regexteter.com
Testeur Regex en ligne PCRE
rexv.org
Testeur Regex en ligne PCRE
debuggex.com
Prend en charge PCRE et fournit un débogueur Regex visuel très utile
regexper.com
JavaScript Style Regex, mais utile pour le débogage
phpliveregex.com
Testeur en ligne pour les fonctions PREG
Regxlib.com
Base de données d'expressions régulières prêtes à l'emploi
régulier-expressions.info
Tutoriels regex, critique de livres, exemples
livres
Titre |
Description |
Auteur |
éditeur |
Maîtriser les expressions régulières
Le livre regex incorrect
Jeffrey Friedl
O’Reilly
Référence de poche d'expression régulière
Expressions régulières pour Perl, Ruby, PHP, Python, C, Java et .NET
Tony Stubblebine
O’Reilly
Questions fréquemment posées (FAQ) sur les expressions régulières (regex)
Quelles sont les applications pratiques des expressions régulières (regex)?
Les expressions régulières (regex) sont incroyablement polyvalentes et peuvent être utilisées dans une variété d'applications pratiques. Ils sont couramment utilisés dans la validation des données pour s'assurer que la saisie de l'utilisateur correspond à un format spécifique, comme une adresse e-mail ou un numéro de téléphone. Ils peuvent également être utilisés dans le grattage Web pour extraire des informations spécifiques à partir d'une page Web. De plus, Regex peut être utilisé dans le traitement de texte pour les tâches telles que la recherche et le remplacement de chaînes de texte spécifiques, la division d'une chaîne en un tableau de sous-chaînes, et plus encore.
Comment puis-je créer des expressions régulières complexes (regex) ?
La création d'expressions régulières complexes implique de comprendre et de combiner divers composants regex. Il s'agit notamment des littéraux, des classes de caractères, des quantificateurs et des métacharacteurs. En combinant ces composants de différentes manières, vous pouvez créer des expressions régulières qui correspondent à une grande variété de modèles. Par exemple, vous pouvez créer une expression régulière qui correspond aux adresses e-mail, aux numéros de téléphone ou aux URL
Quelles sont les erreurs courantes à éviter lors de l'utilisation d'expressions régulières (regex)?
Certaines erreurs courantes à éviter lors de l'utilisation d'expressions régulières incluent une sur-utilisation ou une mauvaise utilisation de certains composants, tels que le point (.) Ou l'astérisque ( *), ce qui peut conduire à des résultats inattendus. Une autre erreur courante n'est pas d'échapper correctement à des caractères spéciaux lorsqu'ils sont censés être interprétés littéralement. De plus, il est important de se rappeler que les expressions régulières sont sensibles à la casse par défaut, vous devez donc utiliser les indicateurs appropriés si vous souhaitez ignorer le cas.
Comment puis-je tester mes expressions régulières (regex)?
Il existe plusieurs outils en ligne qui vous permettent de tester vos expressions régulières. Ces outils vous permettent généralement d'entrer une expression régulière et une chaîne de test, puis ils mettent en évidence les parties de la chaîne de test qui correspondent à l'expression régulière. Cela peut être un excellent moyen de déboguer vos expressions régulières et de vous assurer qu'elles fonctionnent comme prévu.
Les expressions régulières (regex) peuvent-elles être utilisées dans tous les langages de programmation?
Les langages de programmation les plus modernes prennent en charge régulièrement les langages réguliers expressions sous une forme ou une autre. Cependant, la syntaxe et les fonctionnalités spécifiques prises en charge peuvent varier entre les langues. Par exemple, JavaScript, Python et Ruby prennent tous en charge les expressions régulières, mais elles ont chacune leur propre syntaxe et fonctionnalités. Bien que les expressions régulières puissent être incroyablement puissantes, elles peuvent également être à forte intensité de ressources si elles ne sont pas utilisées correctement. Des expressions régulières complexes peuvent prendre beaucoup de temps à exécuter, en particulier sur les grandes chaînes de texte. Par conséquent, il est important d'utiliser les expressions régulières judicieusement et de les optimiser autant que possible.
Comment puis-je optimiser mes expressions régulières (regex)?
Il existe plusieurs stratégies pour optimiser les expressions régulières. Il s'agit notamment d'éviter les quantificateurs inutiles, d'utiliser des groupes non capturés lorsque vous n'avez pas besoin du texte apparié et d'utiliser des classes de caractères au lieu de l'alternance dans la mesure du possible. De plus, certains moteurs d'expression réguliers offrent des fonctionnalités d'optimisation, telles que des quantificateurs paresseux, qui peuvent améliorer les performances.
Quelles sont les ressources pour en savoir plus sur les expressions régulières (regex)?
Il existe de nombreuses ressources Disponible pour en savoir plus sur les expressions régulières. Il s'agit notamment de tutoriels en ligne, de livres et de plateformes d'apprentissage interactives. De plus, de nombreux langages de programmation ont une documentation approfondie sur leur syntaxe et fonctionnalités d'expression régulière.
Les expressions régulières (regex) peuvent-elles être utilisées pour analyser HTML ou XML?
Bien qu'il soit techniquement possible d'utiliser des expressions régulières Pour analyser HTML ou XML, il n'est généralement pas recommandé. En effet, HTML et XML ont une structure imbriquée qui peut être difficile à capturer avec précision avec des expressions régulières. Au lieu de cela, il est généralement préférable d'utiliser un analyseur HTML ou XML dédié.
Quelles sont les alternatives aux expressions régulières (regex)?
Bien que les expressions régulières soient incroyablement puissantes, ils ne sont pas toujours le meilleur outil pour le travail. Selon la tâche à accomplir, vous pourriez mieux utiliser une approche différente. Par exemple, pour les tâches de manipulation de chaînes simples, vous pourrez peut-être utiliser des méthodes de chaîne intégrées au lieu d'expressions régulières. Pour l'analyse de HTML ou XML, vous utiliseriez généralement un analyseur dédié. Et pour des tâches de traitement de texte complexes, vous voudrez peut-être envisager d'utiliser une bibliothèque de traitement du langage naturel.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!