web-dev-qa-db-fra.com

Regex pour les noms

Je commence tout juste à explorer les "merveilles" de regex. En tant que personne qui tire des leçons d'essais et d'erreurs, je me bats vraiment parce que mes essais génèrent un nombre démesuré d'erreurs ... Mes expériences se trouvent dans PHP en utilisant ereg ().

En tous cas. Je travaille avec les prénoms et les noms de famille séparément, mais pour le moment, j'utilise la même expression régulière. Jusqu'ici j'ai:

^[A-Z][a-zA-Z]+$  

Toute chaîne de longueur commençant par une majuscule et comportant uniquement des lettres (majuscules ou non) pour le reste. Mais là où je tombe en morceaux, c'est la gestion des situations spéciales qui peuvent se produire n'importe où.

  • Noms composés (Worthington-Smythe) 
  • Noms d'Apostophies (D'Angelo) 
  • Noms avec des espaces (Van der Humpton) - les majuscules au milieu qui peuvent être nécessaires ou non sont bien au-delà de mes intérêts à ce stade.
  • Noms communs (Ben et Jerry)

Peut-être y a-t-il un autre moyen de nommer un nom auquel je ne pense pas, mais je suppose que si je peux comprendre ce que je pense, je peux ajouter quelque chose. Je suis presque sûr qu'il y aura des cas où plus d'une de ces situations se présentent sous un même nom.

Donc, je pense que le but ultime est que mon expression rationnelle accepte également un espace, des traits d'union, des esperluettes et des apostrophes - mais pas au début ni à la fin du nom pour être techniquement correct.

23
Humpton
  • Noms composés (Worthington-Smythe)

Ajouter un - dans la deuxième classe de caractères. Le moyen le plus simple de le faire est de l’ajouter au début afin qu’il ne puisse pas être interprété comme un modificateur de plage (comme dans a-z

  • Noms d'Apostophies (D'Angelo)

Une façon naïve de le faire serait comme ci-dessus, en donnant:

^ [A-Z] [- 'a-zA-Z] + $

N'oubliez pas que vous devrez peut-être y échapper à l'intérieur de la chaîne! Une "meilleure" façon, étant donné votre exemple pourrait être:

^ [A-Z] '? [- a-zA-Z] + $

Ce qui permettra une éventuelle apostrophe unique en deuxième position.

  • Noms avec des espaces (Van der Humpton) - les majuscules au milieu qui peuvent être nécessaires ou non sont bien au-delà de mes intérêts à ce stade.

Ici, je serais tenté de refaire notre façon naïve:

^ [A-Z] '? [- a-zA-Z] + $

Un meilleur moyen pourrait être:

^ [A-Z] '? [- a-zA-Z] ([a-zA-Z]) * $

Qui cherche des mots supplémentaires à la fin. Ce n'est probablement pas une bonne idée si vous essayez de faire correspondre des noms dans un corps de texte supplémentaire, mais là encore, l'original n'aurait pas aussi bien fonctionné.

  • Noms communs (Ben et Jerry)

À ce stade, vous ne regardez plus des noms uniques?

Quoi qu'il en soit, comme vous pouvez le constater, les regex ont l'habitude de grandir très vite ...

40
Matthew Scharley

Cette regex est parfaite pour moi.

^([ \u00c0-\u01ffa-zA-Z'\-])+$

Cela fonctionne très bien dans les environnements php utilisant preg_match (), mais ne fonctionne pas partout.

Il correspond à Jérémie O'Co-nor donc je pense qu'il correspond à tous les noms UTF-8.

46
Daan

LES MEILLEURS EXPRESSIONS DE REGEX POUR LES NOMS:

  • Je vais utiliser le terme caractère spécial pour faire référence aux trois caractères suivants:
    1. Tiret -
    2. Trait d'union '
    3. Point .
  • Les espaces et les caractères spéciaux ne peuvent pas apparaître deux fois de suite (par exemple: - ou '. ou ..
  • Coupé (aucun espace avant ou après)
  • De rien ;)

Nom unique obligatoire, SANS espaces, SANS caractères spéciaux:

^([A-Za-z])+$
  • Sierra est valide, Jack Alexander est invalide (a un espace), O'Neil est invalide (a un caractère spécial)

Nom unique obligatoire, SANS espaces,AVECcaractères spéciaux:

^[A-Za-z]+(((\'|\-|\.)?([A-Za-z])+))?$
  • Sierra est valide, O'Neil est valide, Jack Alexander est invalide (a un espace)

Nom unique obligatoire, noms supplémentaires facultatifs ,AVECespaces, AVEC caractères spéciaux:

^[A-Za-z]+((\s)?((\'|\-|\.)?([A-Za-z])+))*$
  • Jack Alexander est valide, Sierra O'Neil est valide

Nom unique obligatoire, noms supplémentaires facultatifs ,AVECespaces,SANScaractères spéciaux: 

^[A-Za-z]+((\s)?([A-Za-z])+)*$
  • Jack Alexander est valide, Sierra O'Neil est invalide (a un caractère spécial) 

CAS PARTICULIER

De nombreux appareils intelligents modernes ajoutent des espaces à la fin de chaque mot. Ainsi, dans mes applications, j'autorise un nombre illimité d'espaces avant et après la chaîne, puis je le découpe dans le code. J'utilise donc les éléments suivants:

Nom unique obligatoire + noms supplémentaires facultatifs + espaces + caractères spéciaux:

^(\s)*[A-Za-z]+((\s)?((\'|\-|\.)?([A-Za-z])+))*(\s)*$

Ajoutez vos propres caractères spéciaux

Si vous souhaitez ajouter vos propres caractères spéciaux, disons un trait de soulignement _ c'est le groupe que vous devez mettre à jour: 

(\'|\-|\.)

À

(\'|\-|\.|\_)

PS: Si vous avez des questions, commentez ici et je recevrai un email et vous répondrai;)

9
Taher Ahmed

Bien que je sois d’accord avec les réponses disant que vous ne pouvez pas faire cela avec regex, je soulignerai que certaines des objections (caractères internationalisés) peuvent être résolues en utilisant des chaînes UTF et la classe de caractères \p{L} (correspond à une "lettre" unicode .

6
eyelidlessness

J'appuie le conseil d'abandon. Même si vous considérez des nombres, des traits d'union, des apostrophes, etc., quelque chose comme [a-zA-Z] n'accroche toujours pas les noms internationaux (par exemple, ceux qui ont šđčćž, l'alphabet cyrillique ou les caractères chinois ...)

Mais ... pourquoi essayez-vous même de vérifier les noms? Quelles erreurs essayez-vous d'attraper? Ne pensez-vous pas que les gens savent écrire leur nom mieux que vous? ;) Sérieusement, la seule chose que vous puissiez faire en essayant de vérifier les noms est d’irriter les gens avec des noms inhabituels.

4
Domchi

Cela a fonctionné pour moi:

 +[a-z]{2,3} +[a-z]*|[\w'-]*

Cette expression rationnelle correspondra correctement aux noms suivants:

jean-Claude Van Damme

nadine arroyo-rodriquez

wayne la pierre

beverly d'angelo

billy-Bob Thornton

tito puente

susan del Rio

Il regroupera "van damme", "arroyo-rodriquez" "d'angelo", "billy-bob", etc., ainsi que des noms singuliers comme "wayne".

Notez qu'il ne teste pas que le contenu groupé est en réalité un nom valide. Comme d'autres l'ont dit, vous aurez besoin d'un dictionnaire pour cela. De plus, il va regrouper les nombres, donc si c'est un problème, vous voudrez peut-être modifier la regex.

J'ai écrit ceci pour analyser les noms d'une application MapReduce. Tout ce que je voulais, c'était d'extraire des mots du champ du nom, en regroupant les mots del foo et la et les billy-bobs en un mot afin de rendre la génération de paires clé-valeur plus précise.

4
uke

En gros, je suis d’accord avec Paul ... Vous rencontrerez toujours des exceptions, comme di Caprio, DeVil, etc.

Remarques sur votre message: en PHP, ereg est généralement considéré comme obsolète (lent, incomplet) au profit de preg (expressions rationnelles PCRE).
Et vous devriez essayer un testeur de regex, comme le puissant Regex Coach : ils sont parfaits pour tester rapidement des RE contre des chaînes arbitraires.

Si vous avez vraiment besoin de résoudre votre problème et que vous n'êtes pas satisfait des réponses ci-dessus, il suffit de demander, je vais tenter le coup.

4
PhiLho

Regarde ça:

^(([A-Za-z]+[,.]?[ ]?|[a-z]+['-]?)+)$

 regex

Vous pouvez le tester ici : https://regex101.com/r/mS9Gd7/46

2
tk_

Voir cette question pour plus de choses liées liées "détection de nom". 

regex pour correspondre à un maximum de 4 espaces

En gros, vous avez un problème en ce qu’il n’existe en réalité aucun caractère qui ne puisse former une chaîne de nom légal. 

Si vous vous limitez toujours aux mots sans ä ü æ ß et d'autres caractères similaires non strictement ascii. 

Procurez-vous une copie de la table de caractères UTF32 et réalisez le nombre de millions de caractères valides qui manqueraient à votre regex simple. 

1
Kent Fredric

Vous pouvez facilement neutraliser le caractère majuscule ou minuscule des lettres - même dans des emplacements inattendus ou inhabituels - en convertissant la chaîne en majuscule à l'aide destrtoupper ()regex.

1
Pat Kelly

Pour ajouter plusieurs points dans le nom d'utilisateur, utilisez cette expression régulière:

^[a-zA-Z][a-zA-Z0-9_]*\.?[a-zA-Z0-9_\.]*$

La longueur de la chaîne peut être définie séparément.

1
Abhisek.test

Pour améliorer la réponse de daan: 

^([\u00c0-\u01ffa-zA-Z]+\b['\-]{0,1})+\b$

n'autorise qu'un seul trait d'union ou apostrophie dans a-z et des caractères Unicode valides.

effectue également un retour en arrière pour s’assurer qu’il n’ya ni trait d’union ni apostrophes à la fin de la chaîne.

1
majestic

J'ai rencontré le même problème, et comme beaucoup d'autres qui ont posté, ce n'est pas une expression à 100% infaillible, mais cela fonctionne pour nous.

/([\-'a-z]+\s?){2,4}/

Cela permettra de rechercher d'éventuels traits d'union et/ou apostrophes dans le prénom et/ou le nom, ainsi que de rechercher un espace entre le prénom et le nom. La dernière partie est un peu de magie qui vérifie entre 2 et 4 noms. Si vous avez tendance à avoir beaucoup d'utilisateurs internationaux pouvant avoir 5 voire 6 noms, vous pouvez le changer en 5 ou 6 et cela devrait fonctionner pour vous.

1
paviktherin
^[A-Z][a-zA-Z '&-]*[A-Za-z]$ 

Acceptera tout ce qui commence par une lettre majuscule, suivi de zéro ou plus de toute lettre, espace, trait d'union, ascendant ou apostrophes et se terminant par une lettre.

1
Robert Gamble

J'ai mis au point ce modèle RegEx pour les noms:

/^([a-zA-Z]+[\s'.]?)+\S$/

Ça marche. Je pense que vous devriez l'utiliser aussi.

Il ne correspond qu'à des noms ou des chaînes comme:

Dr. Shaquil O'Neil Armstrong Buzz-Aldrin

Il ne correspondra pas aux chaînes avec 2 ou plusieurs espaces tels que:

John Paul

Il ne fera pas correspondre les chaînes avec des espaces finaux comme:

John Paul

Le texte ci-dessus a un espace de fin. Essayez de surligner ou de sélectionner le texte pour voir l'espace

Voici ce que j'utilise pour apprendre et créer vos propres modèles de regex:

RegExr: Leanr, construire et tester RegEx

0
doncadavona

Je l'ai utilisé, car name peut faire partie de file-patch.

//http://support.Microsoft.com/kb/177506
foreach(array('/','\\',':','*','?','<','>','|') as $char)
  if(strpos($name,$char)!==false)
      die("Not allowed char: '$char'");
0
user669677

Bonne journée !

0
Benjamin

je pense que "/ ^ [a-zA-Z '] + $ /" n'est pas suffisant pour permettre de passer d'une lettre à l'autre. Nous pouvons ajuster la plage en ajoutant {4,20}, ce qui signifie que la plage de lettres va de 4 à 20.

0
atif1512

vous pouvez utiliser ceci ci-dessous pour les noms

^[a-zA-Z'-]{3,}\s[a-zA-Z'-]{3,}$

^ début de la chaîne

$ fin de la chaîne

\s espace

[a-zA-Z'-\s]{3,} acceptera tout nom de 3 caractères ou plus, et comprendra les noms avec ' ou - comme jean-luc

Donc, dans notre cas, il acceptera uniquement les noms en 2 parties séparées par un espace.


en cas de plusieurs prénoms, vous pouvez ajouter un \s

^[a-zA-Z'-\s]{3,}\s[a-zA-Z'-]{3,}$
0
Aominé

si vous ajoutez des espaces, alors "Il est allé au marché le dimanche" serait un nom valide.

Je ne pense pas que vous puissiez faire cela avec une regex, vous ne pouvez pas facilement détecter les noms d'un bloc de texte en utilisant une regex, vous auriez besoin d'un dictionnaire de noms approuvés et une recherche en fonction de cela. Tous les noms ne figurant pas sur la liste ne seraient pas détectés.

0
Osama Al-Maadeed