Fermer

juillet 2, 2020

Guide du débutant –


Dans ce guide, vous apprendrez l'expression rationnelle ou la syntaxe des expressions régulières. À la fin, vous serez en mesure d'appliquer des solutions d'expression régulière dans la plupart des scénarios qui l'exigent dans votre travail de développement Web.

Les expressions régulières ont de nombreux cas d'utilisation, notamment:

  • validation d'entrée de formulaire
  • grattage Web
  • rechercher et remplacer
  • le filtrage des informations dans des fichiers texte massifs tels que les journaux

Expressions régulières, ou regex comme on les appelle communément, ont l'air compliqués et intimidants pour les nouveaux utilisateurs. Jetez un œil à cet exemple:

 / ^ [a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-] + @ [a-zA-Z0-9-] + (?: . [a-zA-Z0-9-] +) * $ /

Cela ressemble à du texte tronqué. Mais ne désespérez pas, il y a une méthode derrière cette folie.

 xkcd.com/208

Credit: xkcd

Je vais vous montrer comment maîtriser les expressions régulières en un rien de temps. Tout d'abord, clarifions la terminologie utilisée dans ce guide:

  • motif : motif d'expression régulière
  • chaîne : chaîne de test utilisée pour faire correspondre le motif
  • chiffre : 0-9
  • lettre : az, AZ
  • symbole :! $% ^ & * () _ + | ~ – = `{} []: ”; '<>?,. /
  • espace : espace blanc unique, tabulation
  • caractère : fait référence à une lettre, un chiffre ou un symbole

Notions de base

Pour apprendre rapidement l'expression rationnelle avec ce guide, visitez Regex101 où vous pouvez créer des modèles d'expression régulière et les tester par rapport aux chaînes (texte) que vous fournissez.

Lorsque vous ouvrez le site, vous ' ll faudra sélectionner la saveur JavaScript car c'est ce que nous allons utiliser pour ce guide. (La syntaxe des expressions régulières est généralement la même pour toutes les langues, mais il existe quelques différences mineures.)

Ensuite, vous devez désactiver les indicateurs globaux et multi-lignes dans Regex101. Nous les couvrirons dans la section suivante. Pour l'instant, nous allons examiner la forme d'expression régulière la plus simple que nous puissions créer. Saisissez les informations suivantes:

  • champ de saisie regex : chat
  • chaîne de test : rat bat cat chat assis fat cats cat eat tat cat mat CAT

 regex de base

Notez que les expressions régulières en JavaScript commencent et finissent par / . Si vous deviez écrire une expression régulière dans du code JavaScript, cela ressemblerait à ceci: / cat / sans aucun guillemet. Dans l'état ci-dessus, l'expression régulière correspond à la chaîne «cat». Cependant, comme vous pouvez le voir dans l'image ci-dessus, il existe plusieurs chaînes de "chat" qui ne sont pas appariées. Dans la section suivante, nous verrons pourquoi.

Indicateurs de regex globaux et insensibles à la casse

Par défaut, un modèle de regex ne renverra que la première correspondance qu'il trouve. Si vous souhaitez renvoyer des correspondances supplémentaires, vous devez activer le drapeau global noté g . Les motifs d'expression régulière sont également sensibles à la casse par défaut. Vous pouvez remplacer ce comportement en activant l'indicateur insensible désigné par i . Le modèle d'expression régulière mis à jour est maintenant entièrement exprimé par / cat / gi . Comme vous pouvez le voir ci-dessous, toutes les chaînes "cat" ont été appariées, y compris celle avec un cas différent.

 indicateur global insensible

Jeux de caractères

Dans l'exemple précédent, nous avons appris à exécuter exactement correspond à la casse. Et si nous voulions faire correspondre «chauve-souris», «chat» et «graisse». Nous pouvons le faire en utilisant les jeux de caractères notés []. Fondamentalement, vous mettez plusieurs caractères que vous souhaitez faire correspondre. Par exemple, [bcf] à correspondra à plusieurs chaînes comme suit:

 jeux de caractères

Les jeux de caractères fonctionnent également avec des chiffres.

Plages

Supposons que nous voulons faire correspondre tous les mots finissant par à . Nous pourrions fournir l'alphabet complet à l'intérieur du jeu de caractères, mais ce serait fastidieux. La solution consiste à utiliser des gammes comme celle-ci [a-z] à :

 gammes

Voici la chaîne complète qui est testée: rat chauve-souris chat assis chats gras mangent tat chat chien mat CAT .

Comme vous pouvez le voir, tous les mots correspondent comme prévu. J'ai ajouté le mot chien juste pour lancer un match invalide. Voici d'autres façons d'utiliser les plages:

  • Gamme partielle : sélections telles que [a-f] ou [g-p].

  • Gamme capitalisée : [A-Z].

  • Plage de chiffres : [0-9].

  • Plage de symboles : par exemple, [#$%&@].

  • Plage mixte : par exemple, [a-zA-Z0-9] comprend tous les chiffres, les lettres minuscules et majuscules. Notez qu'une plage spécifie uniquement plusieurs alternatives pour un seul caractère dans un modèle.

    Pour mieux comprendre comment définir une plage, il est préférable de consulter la table ASCII complète afin de voir comment les caractères sont commandés.

 table ascii

Caractères répétitifs

Supposons que vous souhaitiez faire correspondre tous les mots de trois lettres. Vous le feriez probablement comme ceci:

 [a-z] [a-z] [a-z]

Cela correspondrait à tous les mots de trois lettres. Mais que faire si vous voulez faire correspondre un mot de cinq ou huit caractères. La méthode ci-dessus est fastidieuse. Il existe une meilleure façon d'exprimer un tel modèle en utilisant la notation {} accolades. Il vous suffit de spécifier le nombre de caractères répétés. Voici des exemples:

  • a {5} correspondra à "aaaaa".
  • n {3} correspondra à "nnn".
  • [a-z] {4 } correspondra à n'importe quel mot de quatre lettres tel que "porte", "chambre" ou "livre".
  • [a-z] {6,} fera correspondre n'importe quel mot avec six lettres ou plus. [19659004] [a-z] {8,11} fera correspondre n'importe quel mot entre huit et 11 lettres. La validation de base du mot de passe peut être effectuée de cette façon.
  • [0-9] {11} correspondra à un nombre à 11 chiffres. La validation internationale de base du téléphone peut être effectuée de cette façon.

Les métacaractères vous permettent d'écrire des modèles d'expression régulière encore plus compacts. Examinons-les un par un:

  • d correspond à n'importe quel chiffre identique à [0-9]
  • w correspond à n'importe quelle lettre, chiffre et caractère de soulignement [19659004] s correspond à un espace blanc – c'est-à-dire un espace ou une tabulation
  • t correspond à un caractère de tabulation uniquement

D'après ce que nous avons appris jusqu'à présent, nous pouvons écrire des expressions régulières comme ceci:

  • w {5} correspond à n'importe quel mot de cinq lettres ou à un nombre à cinq chiffres
  • d {11} correspond à un Numéro à 11 chiffres tel qu'un numéro de téléphone

Caractères spéciaux

Les caractères spéciaux nous poussent un peu plus loin dans l'écriture d'expressions de modèle plus avancées:

  • + : Un ou plusieurs quantificateurs (le caractère précédent doit exister et peut éventuellement être dupliqué). Par exemple, l'expression c + à correspondra à «cat», «ccat» et «ccccccccat». Vous pouvez répéter le caractère précédent autant de fois que vous le souhaitez et vous obtiendrez toujours une correspondance.

  • ? : zéro ou un quantificateur (le caractère précédent est facultatif). Par exemple, l'expression c? At ne correspondra qu'à "cat" ou "at".

  • * : zéro ou plusieurs quantificateurs (le caractère précédent est facultatif et peut éventuellement être dupliqué). Par exemple, l'expression c * at correspondra à «at», «cat» et «ccccccat». C'est comme la combinaison de + et ? .

  • : ce "caractère d'échappement" est utilisé lorsque nous voulons utiliser littéralement un caractère spécial. Par exemple, c * correspondra exactement à «c *» et non à «ccccccc».

  • [^] : cette notation «négation» est utilisée pour indiquer un caractère qui ne doit pas être mis en correspondance dans une plage. Par exemple, l'expression b [^a-c] ld ne correspondra pas à «chauve» ou «bbld» car les secondes lettres a à c sont négatives. Cependant, le motif correspondra à «beld», «bild», «bold» et ainsi de suite.

  • . : cette notation «do» correspondra à n'importe quel chiffre, lettre ou symbole, sauf la nouvelle ligne. Par exemple, . {8} correspondra à un mot de passe à huit caractères composé de lettres, de chiffres et de symboles. par exemple, "mot de passe" et "P @ ssw0rd" correspondront tous les deux.

D'après ce que nous avons appris jusqu'à présent, nous pouvons créer une variété intéressante d'expressions régulières compactes mais puissantes. Par exemple:

  • . + correspond à un ou à un nombre illimité de caractères. Par exemple, "c", "cc" et "bcd # .670" correspondront tous.
  • [a-z] + correspondra à tous les mots en minuscules, quelle que soit leur longueur, tant qu'ils contiennent au moins une lettre . Par exemple, «livre» et «salle de réunion» correspondront tous les deux.

Groupes

Tous les caractères spéciaux que nous venons de mentionner n'affectent qu'un seul caractère ou un ensemble de plages. Et si nous voulions que l'effet s'applique à une section de l'expression? Nous pouvons le faire en créant des groupes à l'aide de crochets - () . Par exemple, le modèle book (.com)? correspondra à la fois à «book» et à «book.com», puisque nous avons rendu la partie «.com» facultative.

Voici une opération plus complexe exemple qui serait utilisé dans un scénario réaliste tel que la validation de l'e-mail:

  • modèle: @ w + . w {2,3} (. w {2,3})? [19659004] chaîne de test: abc.com abc @ mail @ mail.com @ mail.co.ke

 validation partielle par e-mail

Caractères alternatifs

Dans l'expression régulière, nous pouvons spécifier caractères alternatifs utilisant le symbole «pipe» - | . Ceci est différent des caractères spéciaux que nous avons montrés précédemment car il affecte tous les caractères de chaque côté du symbole de tuyau. Par exemple, le motif sat | sit correspondra aux chaînes "sat" et "sit". Nous pouvons réécrire le modèle en s (a | i) t pour faire correspondre les mêmes chaînes.

Le modèle ci-dessus peut être exprimé en s (a | i) t en utilisant () parenthèses.

Modèles de début et de fin

Vous avez peut-être remarqué que certaines correspondances positives sont le résultat d'une correspondance partielle. Par exemple, si j'ai écrit un modèle pour correspondre à la chaîne «boo», la chaîne «book» obtiendra également une correspondance positive, bien qu'elle ne soit pas exacte. Pour y remédier, nous utiliserons les notations suivantes:

  • ^ : placé au début, ce caractère correspond à un motif au début d'une chaîne.
  • $ : placé à la fin, ce caractère correspond à un motif à la fin de la chaîne.

Pour corriger la situation ci-dessus, nous pouvons écrire notre motif comme boo $ . Cela garantira que les trois derniers caractères correspondent au modèle. Cependant, il y a un problème que nous n'avons pas encore pris en compte, comme le montre l'image suivante:

 notations de début et de fin

La chaîne "sboo" obtient une correspondance car elle remplit toujours la correspondance de modèle actuelle exigences. Pour résoudre ce problème, nous pouvons mettre à jour le modèle comme suit: ^ boo $ . Cela correspondra strictement au mot «boo». Si vous les utilisez tous les deux, les deux règles sont appliquées. Par exemple, ^ [a-z] {5} $ correspond strictement à un mot de cinq lettres. Si la chaîne comporte plus de cinq lettres, le modèle ne correspond pas.

Regex en JavaScript

 // Exemple 1
const regex1 = / a-z / ig

// Exemple 2
const regex2 = new RegExp (/ [a-z] /, 'ig')

Si Node.js est installé sur votre machine, ouvrez un terminal et exécutez la commande node pour lancer l'interpréteur de commandes Node.js. Ensuite, exécutez comme suit:

 Nœud regex interactif

N'hésitez pas à jouer avec plus de motifs regex. Une fois terminé, utilisez la commande .exit pour quitter le shell.

Exemple du monde réel: validation des e-mails

Comme nous concluons ce guide, regardons une utilisation populaire de regex, email validation . (Par exemple, nous pourrions vouloir vérifier qu'une adresse e-mail qu'un utilisateur a saisie dans un formulaire est une adresse e-mail valide.)

Ce sujet est plus compliqué que vous ne le pensez. La syntaxe de l'adresse e-mail est assez simple: {nom} @ {domaine} . En théorie, une adresse e-mail peut contenir un nombre limité de symboles tels que # - @ &%. etc. Cependant, l'emplacement de ces symboles est important. Les serveurs de messagerie ont également des règles différentes sur l'utilisation des symboles. Par exemple, certains serveurs traitent le symbole + comme non valide. Dans d'autres serveurs de messagerie, le symbole est utilisé pour la sous-adresse de messagerie .

Pour tester vos connaissances, essayez de créer un modèle d'expression régulière qui ne correspond qu'aux adresses e-mail valides indiquées ci-dessous:

 # email invalide
abc
abc.com

# Adresse e-mail valable
abc@mail.com
abc@mail.nz
abc@mail.co.nz
abc123@mail.com
abc.def@music.com

# préfixe e-mail invalide
abc-@mail.com
abc..def @ mail.com
.abc @ mail.com
abc#def@mail.com

# préfixe e-mail valide
abc-d@mail.com
abc.def@mail.com
abc@mail.com
abc_def@mail.com

# suffixe de domaine non valide
abc.def@mail.c
abc.def@mail#archive.com
abc.def@mail
abc.def @ mail..com

# suffixe de domaine valide
abc.def@mail.cc
abc.def@mail-archive.com
abc.def@mail.org
abc.def@mail.com
domaine pleinement qualifié@exemple.com

Notez que certaines adresses électroniques marquées comme valides peuvent ne pas être valides pour certaines organisations, tandis que certaines qui sont marquées comme non valides peuvent en fait être autorisées dans d'autres organisations. Quoi qu'il en soit, apprendre à créer des expressions régulières personnalisées pour les organisations pour lesquelles vous travaillez est primordial afin de répondre à leurs besoins. Si vous êtes bloqué, vous pouvez envisager les solutions possibles suivantes. Notez qu'aucun d'entre eux ne vous donnera une correspondance à 100% sur les chaînes de test de courrier électronique valides ci-dessus.

 ^  w * ( -  w)? (.  W *)? @  W * (-  w *)? .  w {2,3} (.  w {2,3})? $
 ^ (([^<>()[] \.,;:  S @ "] + (. [^<>()[] \.,;:  S @"] +) *) | (". +")) @ (( [[0-9] {1,3} . [0-9] {1,3} . [0-9] {1,3} . [0-9] {1,3}]) | (([a-zA-Z-0-9] + .) + [a-zA-Z] {2,})) $

Résumé

J'espère que vous avez maintenant appris les bases des expressions régulières. Nous n'avons pas couvert toutes les fonctionnalités de regex dans ce guide de démarrage rapide, mais vous devriez avoir suffisamment d'informations pour résoudre la plupart des problèmes qui nécessitent une solution de regex. Pour en savoir plus, lisez notre guide sur les meilleures pratiques pour l'application pratique de l'expression régulière dans des scénarios réels.




Source link