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ù.
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.
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
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.
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é.
À 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 ...
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.
LES MEILLEURS EXPRESSIONS DE REGEX POUR LES NOMS:
Nom unique obligatoire, SANS espaces, SANS caractères spéciaux:
^([A-Za-z])+$
Nom unique obligatoire, SANS espaces,AVECcaractères spéciaux:
^[A-Za-z]+(((\'|\-|\.)?([A-Za-z])+))?$
Nom unique obligatoire, noms supplémentaires facultatifs ,AVECespaces, AVEC caractères spéciaux:
^[A-Za-z]+((\s)?((\'|\-|\.)?([A-Za-z])+))*$
Nom unique obligatoire, noms supplémentaires facultatifs ,AVECespaces,SANScaractères spéciaux:
^[A-Za-z]+((\s)?([A-Za-z])+)*$
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)*$
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;)
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 .
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.
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.
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.
Regarde ça:
^(([A-Za-z]+[,.]?[ ]?|[a-z]+['-]?)+)$
Vous pouvez le tester ici : https://regex101.com/r/mS9Gd7/46
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.
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.
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.
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.
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.
^[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.
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:
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'");
/ ^ ([A-Z] [a-z] ([] [a-z] +) (['-] ([&] [])? [A-Z] [a-z] +) *) $ /
Bonne journée !
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.
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,}$
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.