121 votes

Expression régulière qui correspond à un motif ou qui est une chaîne vide

J'ai l'expression régulière suivante qui correspond à un format d'adresse électronique :

^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$

Il est utilisé pour la validation d'un formulaire à l'aide de JavaScript. Cependant, il s'agit d'un champ facultatif. Par conséquent, comment puis-je modifier cette regex pour qu'elle corresponde à un format d'adresse électronique ou à une chaîne vide ?

D'après mes connaissances limitées en matière d'expressions rationnelles, je pense que \b correspond à une chaîne vide, et | signifie "Ou", j'ai donc essayé de faire ce qui suit, mais cela n'a pas fonctionné :

^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$|\b

277voto

polygenelubricants Points 136838

Pour correspondre pattern ou une chaîne vide, utiliser

^$|pattern

Explication

  • ^ y $ sont respectivement le début et la fin des ancres de la chaîne.
  • | est utilisé pour indiquer les alternatives, par exemple this|that .

Références


Sur \b

\b dans la plupart des saveurs est une ancre "limite de mot". Il s'agit d'une correspondance de largeur nulle, c'est-à-dire d'une chaîne vide, mais elle ne correspond qu'aux chaînes de caractères situées à des lieux très spécifiques , à savoir aux limites d'un mot.

C'est-à-dire, \b se trouve :

  • Entre deux périodes consécutives \w y \W (dans l'un ou l'autre ordre) :
    • c'est-à-dire entre un caractère verbal et un caractère non verbal
  • Entre ^ y \w
    • c'est-à-dire au début de la chaîne si elle commence par \w
  • Entre \w y $
    • c'est-à-dire à la fin de la chaîne si elle se termine par \w

Références


Utilisation d'expressions rationnelles pour faire correspondre les adresses électroniques

Cela n'est pas trivial en fonction de la spécification.

Questions connexes

15voto

Jgonzalez731 Points 23

Une autre solution consisterait à placer votre expression rationnelle entre des parenthèses non capturantes. Ensuite, rendez cette expression optionnelle en utilisant l'option ? qui recherchera 0 (c'est-à-dire une chaîne vide) ou 1 instance du groupe non capturé.

Par exemple :

/(?: some regexp )?/

Dans votre cas, l'expression régulière ressemblerait à ceci :

/^(?:[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+)?$/

No | L'opérateur "ou" est nécessaire !

Aquí est la documentation de Mozilla sur la syntaxe des expressions régulières en JavaScript.

11voto

Zano Points 1471

Je ne sais pas exactement pourquoi vous voudriez valider une adresse électronique facultative, mais je vous suggère d'utiliser l'adresse suivante

^$|^[^@\s]+@[^@\s]+$

sens

^$        empty string
|         or
^         beginning of string
[^@\s]+   any character but @ or whitespace
@         
[^@\s]+
$         end of string

De toute façon, vous n'arrêterez pas les faux courriels et, de cette façon, vous n'arrêterez pas les adresses valides.

1voto

pritaeas Points 1429

\b correspond à une limite de mot. Je pense que vous pouvez utiliser ^$ pour une chaîne vide.

0voto

Nubian Points 116

^$ ne fonctionnait pas pour moi s'il y avait plusieurs motifs dans les expressions rationnelles.

Autre solution :

/(pattern1)(pattern2)?/g

"pattern2" est facultatif. S'il est vide, il n'y a pas de correspondance.

? correspond à (motif2) entre zéro et une fois.

Testé ici ("m" est là à titre d'exemple sur plusieurs lignes) : https://regex101.com/r/mezfvx/1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X