Pour construire des modèles généraux, gérer la répétition d'un caractère est parfois insuffisant. On peut alors utiliser les parenthèses ouvrante et fermante pour délimiter des sous-chaînes ou des groupes de caractères.

Nous avons vu un peu plus haut comment tester la validité dune date au format JJ/MM/AAAA avec l'expression régulière :
/^\d{2}\/\d{2}\/\d{4}$/

Dans cette expression on voit que le modèle \d{2}\/ est répété deux fois (pour les jours et les mois). On peut donc entourer ce modèle avec des parenthèses, et lui appliquer un quantificateur :

(\d{2}\/){2}

L'expression complète devient :

/^(\d{2}\/){2}\d{4}$/

Le raccourci est d'autant plus interessant que nous pouvons facilement modifier l'expression pour tester les dates avec un séparateur autre que le slash (/), comme le tiret (-), le point (.) ou l'espace :
/^(\d{2}[\/\-\. ]){2}\d{4}$/

Ainsi avec une seule expression on peut valider le format d'un date comme 01/02/2003 ou 01-02-2003 ou 01.02.2003 ou 01 02 2003.

Nous pouvons aller plus loin dans le contrôle du format, et la facilité de saisie laissée à l'utilisateur, en spécifiant que le jour et le mois peuvent avoir 1 ou 2 chiffres, et que l'année peut avoir 2 ou 4 chiffres :
/^(\d{1,2}[\/\-\. ]){2}\d{2,4}$/

Ainsi 1/2/03 est tout aussi valide que 1-02-2003 ou 1 2 03.

Remarque : l'expression régulière contrôle simplement que la date saisie correspond à un format particulier, mais ne contrôle pas la validité de la date elle même (ie 32/13/2345 est un format correcte, mais la date n'est pas valide)

Exemple : répétitions de sous-chaînes

Vous vous souvenez de l'exemple de vérification du format d'un nombre (-####.##), pour lequel l'expression régulière est un peu longue si nous voulons gérer aussi la saisie d'un entier sans que l'utilisateur soit obligé de taper le point (.) décimal :
/^-{0,1}\d{1,4}$|^-{0,1}\d{1,4}\.\d{0,2}$/

Avec le groupement de caractère nous pouvons supprimer le ou (|). Commençons par nous occuper du début de la chaîne qui peut commencer éventuellement par le signe moins (-) :
/^(-?)\d{0,4}\.\d{0,2}$/

Pour spécifier que l'utilisateur n'a a saisir le point décimal que si il y a des décimales, il faut grouper la fin de l'expression :
/^(-?)\d{0,4}(\.\d{0,2})?$/

Et voilà !

Exemple : répétitions de sous-chaînes

Exercice : vérifier le format d'une adresse e-mail

Ecrivez l'expression régulière qui permet de vérifier une adresse e-mail répondant à la suite de caractères suivante :

La chaîne ne doit contenir aucun espace et il ne peut y avoir qu'un caractère @.

Les "caractères acceptables" sont :

Remarque : le test de validité est volontairement simplifié. Vous trouverez dans la solution une explication complète sur le format des adresses e-mail conformes à la norme RFC2822.

Exemples à tester :

Une solution possible

Exercice : vérifier une adresse e-mail

Dans cet exercice nous avons vérifié une adresse e-mail tel qu'on le fait le plus souvent, et comme vous en trouverez de nombreux exemple sur le Web. Pourtant ces vérifications ne sont pas bonnes, voire fantaisistes, et s'appuient sur ce que l'on croit que peut être une adresse email valide.
Par exemple, on peut tomber sur des validateurs qui estiment qu'un nom de grand domaine ne peut pas faire plus de 3 caractères. C'est vrai pour les noms de grands domaines géographiques (.fr, .de, .ru), pour le .com, mais faux pour les nouveaux noms comme .info, .name, .museum ou .aero.
Le nom de domaine est toujours considéré comme une chaîne de caractère, mais une adresse IP comme 123.456.78.90 est tout à fait valable.
D'autres exemples d'adresses valables :
"Dark Vador"@zeforce.com
yoda@[123.124.233.4]
+1~1+@un-un.info
{o_o}@oeil.fr
"[[ piat ]]"@ok.com
"C'est vraiment le meilleur" <fp@piat.info>
Surprenant non ?

Le format des adresses e-mail est défini par l'IETF (Internet Engineering Task Force) dans la norme RFC2822 (http://www.ietf.org/rfc/rfc2822.txt ) qui décrit plus généralement le "format des messages Internet". La RFC2822 spécifie ce qui est permis et ce qui ne l'est pas dans une adresse e-mail, et partage une adresse en deux parties séparées par le signe @ : partie_locale@domaine.

La partie_locale peut avoir de 1 à 64 caractères et peut être composée de 2 façons.

Elle peut être une suite de caractères parmi la sélection suivante :
- a à z et A à Z
- 0 à 9
- les caractères !, #, $, %, &, ', *, +, -, /, =, ?, ^, _, `, {, |, }, ~
- le point (.) peut être utilisé, sauf à la première place.

La deuxième façon de composer la partie locale est d'utiliser n'importe quelle suite de caractères (sauf \) et de les entourer avec des guillemets doubles.

La partie_locale doit être traitée comme respectant les différences majuscules et minuscules, même si la norme "décourage" le mélange.

La partie domaine de l'adresse e-mail peut elle aussi être composées de plusieurs façons, mais ne doit jamais excéder 255 caractères au total. La forme la plus courante du domaine est une série de chaînes de caractères, séparées par un point (.). Une chaîne peut être composée de 1 à 63 caractères parmi la sélection suivante :
- a à z,
- 0 à 9,
- trait d'union.
Officiellement la chaîne doit commencer par une lettre, mais dans la pratique des noms de domaines commençant par un chiffre ont été enregistrés.

Généralement la partie domaine est composée de deux chaines, la seconde représentant le nom de grand domaine (.fr par exemple).

La partie domaine ne fait pas de différence entre les majuscules et les minuscules.

La partie domaine peut être composée sous la forme d'une adresse IP, et dans ce cas elle peut être entourée avec des guillements doubles.

L'adresse e-mail peut être précédée d'un commentaire, entouré de guillemets. L'adresse doit alors être elle même entourée par les caractères < et >.

La vérification d'une adresse e-mail, si l'on veut se conformer à la RFC 2822, est donc beaucoup plus complexe qu'on ne le pense généralement, et ne peut être faite correctement avec une seule expression régulière.

Exercice : vérifier une adresse e-mail