Aide pour déchiffrer une expression régulière

Résolu/Fermé
darkdog85 Messages postés 13 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 27 novembre 2012 - 2 déc. 2010 à 22:05
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 - 3 déc. 2010 à 20:15
Bonjour,

On m'a donné une expression régulière pour vérifier la conformité d'une adresse e-mail. Cela est très intéressant de faire en une ligne ce que j'avais codé en 15. L'expression marche très bien, mais j'ai beaucoup de mal à comprendre ce qu'elle représente. c'est la que vous intervenez ;)

la voici :

^[a-z0-9]+([_|.|-]{1}[a-z0-9]+)*@[a-z0-9]+([_|.|-]{1}[a-z0-9]+)*[.]{1}[a-z]{2,6}$

Merci d'avance à ceux qui feront l'effort de la réflexion.

4 réponses

scriptiz Messages postés 1424 Date d'inscription dimanche 21 décembre 2008 Statut Membre Dernière intervention 14 septembre 2023 425
2 déc. 2010 à 22:56
^[a-z0-9]+ qui commence par une série de lettre entre a et z et de chiffres entre 0-9 (minimum 1)
^ = commence
[a-z0-9] soit une lettre entre a et z soit un chiffre entre 0 et 9
+ une fois minimum mais plusieurs fois si on veut

([_|.|-]{1}[a-z0-9]+)* qui contient soit 1 seul _ ou . ou - et de nouveaux des lettres et des chiffres (minimum 1), le tout soit 0 fois, soit plusieurs fois.
[_|.|-] soit _ soit . soit -
{1} une seule fois
[a-z0-9]+ pareil qu'avant

@ il faut qu'il y ait le caractères @

[a-z0-9]+ pareil qu'avant

([_|.|-]{1}[a-z0-9]+)* pareil qu'avant

[.]{1} un point et un seul

[a-z]{2,6}$ se termine par entre 2 et 6 caractères alphabétiques
[a-z] des caractères entre a et z
{2,6} un nombre de ces caractères entre 2 et 6
$ indique la fin de la chaine de caractères.

Voilà j'espère avoir été claire, ce n'est pas facile d'expliquer en condensé tout ça, le mieux à faire c'est que tu lise un cours sur les expressions régulières sur internet (sur developpez il y en a).
1
darkdog85 Messages postés 13 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 27 novembre 2012
3 déc. 2010 à 08:11
Merci tes précisions m'ont déjà été bien utile.
0
scriptiz Messages postés 1424 Date d'inscription dimanche 21 décembre 2008 Statut Membre Dernière intervention 14 septembre 2023 425
3 déc. 2010 à 16:46
Ah j'ai oublié de te dire que le + c'est [1..n] tandis que le * c'est [0..n]

En gros avec le + il faut au minimum 1 fois ce qui précède, tandis qu'avec le * il peut soit y avoir ce qui précède une fois, plusieurs fois, soit zéro fois.
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
3 déc. 2010 à 20:15
Grosso modo,il faut considérer que:

- une expression régulière est une succession de symboles

- elle est obtenue par interprétation d'une chaîne de caractères qui la définit.
Personnellement, je désigne par RE = la chaîne de caractères interprétée, pour bien la distinguer de l'expression régulière = succession de symboles.

- les symboles d'une expression régulière représentent les caractères qui seront acceptées dans les positions successives d'une chaîne matchante

- une position = un emplacement occupé par un caractère dans une chaîne, sans tenir compte de la valeur du caractère en question

- il y a une correspondance stricte UN symbole - UNE position

- là où c'est délicat, c'est qu'UN symbole dans une expression régulière est la plupart du temps défini par PLUSIEURS caractères dans la RE. Il faut donc savoir distinguer dans une RE les groupes de caractères qui représentent chacun un symbole de l'expression régulière.



Ce dernier point ne semble pas poser de problème quand il s'agit de '\d', 's', '\w', etc mais j'ai remarqué que le symbole d'une classe (ou ensemble) de caractères est souvent compris de façon confuse.



Pourtant, [ay34:] définit bien UN SEUL symbole qui exprime quels sont les caractères autorisés qui peuvent être rencontrés à UNE SEULE position.

Les crochets ne sont pas des parenthéses.

Les parenthéses permettent de délimiter plusieurs possibilités entre lesquelles il y a un OU obligatoirement exprimé par '|'

Tandis qu'une classe, qui symbolise aussi plusieurs possibilités, ne concerne toujours qu'une seule position, et donc les possibilités exprimées sont des caractères autorisés solitairement pour une position unique: c'est pour cela qu'il sont écrits les uns à la suite des autres entre les 2 crochets sans avoir à les séparer par le OU '|' . Ce dernier est implicite dans une classe.



Par conséquent, l'écriture [_|.|-]{1} est aberrante.

D'une part elle signifie
"position devant être occupée par '_' ou '|' ou '.' ou '-' ".
Le caractère OU '|' est ainsi défini comme autorisé aussi.

D'autre part,
{1} est aussi superflu puisque le symbole d'une classe n'est destiné qu'à matcher avec une seule position.
De même dans [.]{1} , le {1} est inutile.

Pour spécifier une succession de positions occupées par un des caractères d'une classe, il suffit d'ajouter un quantificateur '+' ou '*', comme à n'importe quel symbole se rapportant à une seule position.





Remarque:

les caractères spéciaux perdent leur spécialité à l'intérieur de crochets, si bien que pour spécifier un point et rien qu'un point, on peut effectivement écrire [.].

Mais cela peut se faire plus simplement aussi en échappant le caractère point: '\.'
0