web-dev-qa-db-fra.com

Incluez le "signe moins" dans cette expression régulière, comment?

J'ai cette regex:

  var alphaExp = /^[a-zA-ZåäöÅÄÖ\s]+$/;

Ceci est pour un champ de nom dans une validation de formulaire.

Je dois rendre possible la saisie de noms comme celui-ci "Anna-nicole" (notez le signe moins) . Actuellement, le signe moins est une erreur.

Je dois refaire cette expression rationnelle de manière à ce qu'un signe moins puisse être inclus dans le nom; de préférence, je devrais faire en sorte que le nom aussi ne puisse pas commence par un signe moins, ou se termine par un. Seuls les signes moins entre "mots ou noms" devraient être autorisés.

Est-ce que quelqu'un sait comment faire cela?

BTW, c'est JavaScript.

28
user188962

Vous devez échapper au signe moins à l'aide d'une barre oblique inverse.

var alphaExp = /^[a-zA-ZåäöÅÄÖ\s\-]+$/;

Pour les empêcher de l'utiliser au début ou à la fin, essayez ce qui suit:

var alphaExp = /^[a-zA-ZåäöÅÄÖ\s]+[a-zA-ZåäöÅÄÖ\s\-]*[a-zA-ZåäöÅÄÖ\s]+$/;
41
Emil H

Dans de nombreux dialectes d'expression régulière, dans une classe de caractères, un trait d'union/moins doit être le premier ou le dernier:

/^[-a-zA-ZåäöÅÄÖ\s]+$/
/^[a-zA-ZåäöÅÄÖ\s-]+$/

Classes de caractère négatives:

/^[^-a-zA-ZåäöÅÄÖ\s]+$/
/^[^a-zA-ZåäöÅÄÖ\s-]+$/

Avec un crochet étroit aussi, placez le crochet à l'avant et le trait d'union à la fin:

/^[]a-zA-ZåäöÅÄÖ\s-]+$/

Et si vous devez exclure les crochets et les traits d'union, alors:

/^[^]a-zA-ZåäöÅÄÖ\s-]+$/

Pour la question, une interprétation pourrait être la suivante: vous souhaitez insister sur les caractères alphabétiques entourant les traits d'union, vous souhaitez uniquement autoriser les espaces au début et à la fin et autoriser les apostrophes lorsque vous autorisez les traits d'union et éviter les traits d'union ou apostrophes.

/^\s*[a-zA-ZåäöÅÄÖ]*([a-zA-ZåäöÅÄÖ]+[-'][a-zA-ZåäöÅÄÖ]+)*\s*$/

Attention: regex formellement testé avec Perl, pas JavaScript.

Début de chaîne, zéro ou plusieurs espaces; zéro ou plusieurs caractères alphabétiques; zéro ou plusieurs séquences de «un ou plusieurs caractères alphabétiques plus un tiret ou une apostrophe et un ou plusieurs caractères alphabétiques», suivi de la fin de la chaîne. Vous pouvez gifler un ensemble supplémentaire de parenthèses après le premier \s* et avant le second \s* pour capturer le nom complet.

Pour Anna-nicole, le premier terme alpha correspondrait à Ann et l'autre terme alpha correspondrait à a-nicole. Pour Anonymous, le premier terme correspondrait à la chaîne entière, le second serait vide. Pour O'Reilly, le premier terme serait vide et le second correspondrait à la chaîne entière. Des noms tels que "C - d" et "Who''Me" seraient rejetés (aucun trait d'union ni apostrophe n'est autorisé). Cela autoriserait Smith-Jones-and-Son comme nom et Smith-And-O'Reilly. Il ne permet pas les traits d'union ou les apostrophes.

Si vous souhaitez autoriser le «nom de famille du prénom», vous avez besoin de deux lots du «noyau» de l'expression rationnelle ci-dessus avec \s+ entre les deux. Etc.

16
Jonathan Leffler
/^[a-zA-ZåäöÅÄÖ\s]+[a-zA-ZåäöÅÄÖ\s\-]*[a-zA-ZåäöÅÄÖ\s\]+$/ 

devrait le faire (il y a une casse désagréable dans Edge avec un nom de caractère unique, auquel cela ne correspond pas. Un nom de personnage unique est-il autorisé ou non?)

1

Cela peut dépendre de la mise en œuvre. En Javascript, la barre oblique inverse échappe au signe moins dans une classe de caractères, mais dans Oracle, par exemple, le fait de ne mettre que le signe moins en premier ou en dernier dans la classe de caractère fera l'affaire.

0
Helge Moulding