web-dev-qa-db-fra.com

expression régulière pour le prénom et le nom

Pour la validation du site Web, j'ai besoin de la validation du prénom et du nom de famille.

Pour le prénom, il ne doit contenir que des lettres, peut contenir plusieurs mots avec des espaces et doit comporter au moins 3 caractères mais au maximum 30 caractères. Une chaîne vide ne doit pas être validée (par exemple, Jason, Jason, Jason Smith, Jason Smith, JASON, Jason Smith, Jason Smith, Jason SMITH).

Pour le nom de famille, il doit s'agir d'un mot unique, composé uniquement de lettres, d'au moins 3 caractères mais d'au plus 30 caractères. Une chaîne vide ne doit pas être validée (par exemple, lazslo, Lazslo, LAZSLO).

105
Hellnar

N'oubliez pas des noms comme:

  • Mathias d'Arras
  • Martin Luther King jr.
  • Hector Sausage-Hausen

Cela devrait faire l'affaire pour la plupart des choses:

/^[a-z ,.'-]+$/i

OU Prenez en charge les noms internationaux avec un super doux Unicode:

/^[a-zA-ZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýżźñçčšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßÇŒÆČŠŽ∂ð ,.'-]+$/u

166
maček

Vous faites de fausses hypothèses sur le format du prénom et du nom. Il est probablement préférable de ne pas valider le nom du tout, mis à part le fait de vérifier qu'il est vide.

72
Sjoerd

Après avoir parcouru toutes ces réponses, j'ai trouvé un moyen de créer un regex minuscule prenant en charge la plupart des langues et n'autorisant que les caractères Word. Il prend même en charge des caractères spéciaux tels que des traits d'union, des espaces et des apostrophes. J'ai testé dans python et il supporte les caractères ci-dessous:

^[\w'\-,.][^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$

Caractères supportés:

abcdefghijklmnopqrstwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
áéíóúäëïöüÄ'
陳大文
łŁőŐűŰZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųū
ÿýżźñçčšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁ
ŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßÇŒÆČŠŽ.-
ñÑâê都道府県Федерации
আবাসযোগ্য জমির걸쳐 있는
23
CristianGuerrero

J'ai cherché, cherché, joué et joué avec, et bien que ce ne soit pas parfait, il peut aider les autres à essayer de valider les noms et prénom qui ont été fournis comme une seule variable.

Dans mon cas, cette variable est $ name.

J'ai utilisé le code suivant pour mon PHP:

    if (preg_match('/\b([A-Z]{1}[a-z]{1,30}[- ]{0,1}|[A-Z]{1}[- \']{1}[A-Z]{0,1}  
    [a-z]{1,30}[- ]{0,1}|[a-z]{1,2}[ -\']{1}[A-Z]{1}[a-z]{1,30}){2,5}/', $name)  
    # there is no space line break between in the above "if statement", any that   
    # you notice or perceive are only there for formatting purposes.  
    # 
    # pass - successful match - do something
    } else {
    # fail - unsuccessful match - do something

J'apprends RegEx moi-même mais j'ai l'explication du code fournie par RegEx Buddy.
C'est ici:

Assert la position à la limite du mot "\ b"

Faites correspondre l'expression régulière ci-dessous et capturez sa correspondance dans le numéro de référence 1
"([AZ] {1} [az] {1,30} [-] {0,1} | [AZ] {1} [-\'] {1} [AZ] {0, 1} [az] {1,30} [-] {0,1} | [az] {1,2} [-\'] {1} [AZ] {1} [az] {1,30}) {2,5} "

Entre 2 et 5 fois, autant de fois que possible, en donnant au besoin (gourmand) "{2,5}"

* J'AI BESOIN DE L'AIDE ICI POUR COMPRENDRE LES RAMIFICATIONS DE CETTE NOTE *

Remarque: j'ai répété le groupe de capture lui-même. Le groupe ne capturera que la dernière itération. Placez un groupe de capture autour du groupe répété pour capturer toutes les itérations. "{2,5}"

Faites correspondre l'expression régulière ci-dessous (en essayant l'alternative suivante uniquement si celle-ci échoue) "[A-Z] {1} [a-z] {1,30} [-] {0,1}"

Faites correspondre un seul caractère dans la plage entre “A” et “Z” "[A-Z] {1}"

Exactement 1 fois "{1}"

Correspond à un seul caractère compris entre “a” et “z” "[a-z] {1,30}"

Entre une et 30 fois, autant de fois que possible, en donnant au besoin (gourmand) "{1,30}"

Faire correspondre un seul caractère présent dans la liste "-" "[-] {0,1}"

Entre zéro et une fois, autant de fois que possible, rendre au besoin (gourmand) "{0,1}"

Vous pouvez également rechercher l'expression régulière numéro 2 ci-dessous (tentative de l'option suivante uniquement si celle-ci échoue) "[AZ] {1} [-\'] {1} [AZ] {0,1} [az] {1,30} [ -] {0,1} "

Faites correspondre un seul caractère dans la plage entre “A” et “Z” "[A-Z] {1}"

Exactement 1 fois "{1}"

Faites correspondre un seul caractère présent dans la liste ci-dessous "[-\'] {1}"

Exactement 1 fois "{1}"

Un des caractères “-” “-” Un 'caractère "\'"

Faites correspondre un seul caractère dans la plage entre “A” et “Z” "[A-Z] {0,1}"

Entre zéro et une fois, autant de fois que possible, rendre au besoin (gourmand) "{0,1}"

Correspond à un seul caractère compris entre “a” et “z” "[a-z] {1,30}"

Entre une et 30 fois, autant de fois que possible, en donnant au besoin (gourmand) "{1,30}"

Faire correspondre un seul caractère présent dans la liste "-" "[-] {0,1}"

Entre zéro et une fois, autant de fois que possible, rendre au besoin (gourmand) "{0,1}"

Ou recherchez l'expression régulière numéro 3 ci-dessous (tout le groupe échoue si celui-ci ne correspond pas) "[az] {1,2} [-\'] {1} [AZ] {1} [az] {1,30} "

Correspond à un seul caractère compris entre “a” et “z” "[a-z] {1,2}"

Entre une et deux fois, autant de fois que possible, en donnant au besoin (gourmand) "{1,2}"

Correspondre à un seul caractère compris entre “” et “'” "[- \'] {1}"

Exactement 1 fois "{1}"

Faites correspondre un seul caractère dans la plage entre “A” et “Z” "[A-Z] {1}"

Exactement 1 fois "{1}"

Correspond à un seul caractère compris entre “a” et “z” "[a-z] {1,30}"

Entre une et 30 fois, autant de fois que possible, en donnant au besoin (gourmand) "{1,30}"

Je sais que cette validation suppose totalement que chaque personne qui remplit le formulaire porte un nom occidental, ce qui peut éliminer la grande majorité des gens dans le monde. Cependant, j’ai le sentiment que c’est un pas dans la bonne direction. Peut-être que cette expression régulière est trop élémentaire pour que les gourous l’adresse de manière simpliste ou peut-être existe-t-il une autre raison pour laquelle j’ai été incapable de trouver le code ci-dessus dans mes recherches. J'ai passé beaucoup trop de temps à essayer de comprendre cela, vous remarquerez probablement à quel point mon esprit est embué par tout cela si vous regardez les noms de mes tests ci-dessous.

J'ai testé le code sur les noms suivants et les résultats sont entre parenthèses à la droite de chaque nom.

  1. STEVE SMITH (échec)
  2. Stev3 Smith (échec)
  3. STeve Smith (échec)
  4. Steve SMith (échec)
  5. Steve Sm1th (transmis le Steve Sm)
  6. d'Are à Beaware (passé le Are à Beaware)
  7. Jo Blow (passé)
  8. Hyoung Kyoung Wu (adopté)
  9. Mike O'Neal (passé)
  10. Steve Johnson-Smith (passé)
  11. Jozef-Schmozev Hiemdel (passé)
  12. O Henry Smith (passé)
  13. Mathais d'Arras (passé)
  14. Martin Luther King Jr (passé)
  15. Centre-ville de James Brown (passé)
  16. Darren McCarty (passé)
  17. George De FunkMaster (passé)
  18. Kurtis B-Ball Basketball (réussi)
  19. Ahmad el Jeffe (passé)

Si vous avez des noms de base, il doit y avoir plus d'un à cinq pour que le code ci-dessus fonctionne, qui sont similaires à ceux que j'ai utilisés lors des tests, ce code pourrait être pour vous.

Si vous avez des améliorations, s'il vous plaît faites le moi savoir. Je n’en suis qu’à ses débuts (premiers mois à comprendre RegEx.

Merci et bonne chance, Steve

15
Steve Kinzey

Bonne journée tout le monde.

J'ai créé un regex personnalisé pour traiter les noms:

J'ai essayé ces types de noms et j'ai trouvé que ça fonctionnait

1) John Smith
2) John D'Largy
3) John Doe-Smith
4) John Doe Smith
5) Hector Sausage-Hausen
6) Mathias d'Arras
7) Martin Luther King
8) Ai Wong
9) Chao Chang
10) Alzbeta Bara

Mon RegEx ressemble à ceci:

^([a-zA-Z]{2,}\s[a-zA-z]{1,}'?-?[a-zA-Z]{2,}\s?([a-zA-Z]{1,})?)

Modèle MVC4:

[RegularExpression("^([a-zA-Z]{2,}\\s[a-zA-z]{1,}'?-?[a-zA-Z]{2,}\\s?([a-zA-Z]{1,})?)", ErrorMessage = "Valid Charactors include (A-Z) (a-z) (' space -)") ]

S'il vous plaît noter le double\pour les caractères d'échappement

Pour ceux d'entre vous qui sont nouveaux dans RegEx, j'ai pensé inclure une explication.
^ (début de ligne)
[a-zA-Z] {2,} (sauf un nom avec au moins deux caractères)
\ s (cherchera un espace blanc entre nom et prénom)
[a-zA-Z] {1,} (nécessite au moins 1 caractère)
'? -? (possibilité de ' ou - pour double tonneau et trait d'union noms de famille)
[a-zA-Z] {2,} (sauf un nom avec au moins deux caractères)
\ s? (possibilité d'un autre espace)
([a-zA-Z] {1,})? * (possibilité d'un deuxième nom de famille) <* br />

J'espère que cela vous aidera dans vos projets.
Sincères amitiés
Francois Muller

14
Francois Muller

Le prénom serait

"([a-zA-Z]{3,30}\s*)+"

Si vous avez besoin que toute la partie du prénom soit plus courte que 30 lettres, vous devez vérifier cela séparément, je pense. L'expression ".{3,30}" devrait le faire.

Les exigences de votre nom de famille se traduiraient par

"[a-zA-Z]{3,30}"

mais vous devriez les vérifier. Il y a beaucoup de noms de famille contenant des espaces.

10
Jens

Comme l'a dit Maček:

N'oubliez pas des noms tels que:

Mathias d'Arras

Martin Luther King jr.

Hector Sausage-Hausen

et pour supprimer les cas tels que:

..Mathias

Martin King, Jr.-

Cela couvrira plus de cas:

^([a-z]+[,.]?[ ]?|[a-z]+['-]?)+$
7
Asim K T

Pour simplifier, vous pouvez utiliser:

(.*)\s(.*)

Ce que j’aime dans ce domaine, c’est que le nom de famille est toujours après le prénom. Par conséquent, si vous entrez ces groupes correspondants dans une base de données et que vous vous appelez John M. Smith, le premier groupe sera John M. et le deuxième groupe sera Smith.

5
egekhter

Je travaille sur l'application qui valide les passeports internationaux (OACI). Nous supportons uniquement les caractères anglais. Alors que la plupart des caractères nationaux étrangers peuvent être représentés par un caractère de l’alphabet latin, par ex. è par e, plusieurs caractères nationaux nécessitent une lettre supplémentaire pour les représenter, par exemple le tréma allemand, qui requiert l’ajout d’un "e" à la lettre, par exemple. ä par ae.

Voici la regex JavaScript pour les prénoms et les noms que nous utilisons:

/^[a-zA-Z '.-]*$/

Le nombre maximum de caractères sur le passeport international va jusqu'à 31 . Nous utilisons maxlength = "31" pour améliorer les messages d'erreur Word au lieu de l'inclure dans la regex.

Voici un extrait de notre code dans AngularJS 1.6 avec la gestion des formulaires et des erreurs:

class PassportController {
  constructor() {
    this.details = {};
    // English letters, spaces and the following symbols ' - . are allowed
    // Max length determined by ng-maxlength for better error messaging
    this.nameRegex = /^[a-zA-Z '.-]*$/;
  }
}

angular.module('akyc', ['ngMessages'])
  .controller('PassportController', PassportController);
 
.has-error p[ng-message] {
  color: #bc111e;
}

.tip {
  color: #535f67;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.6/angular.min.js"></script>
<script src="https://code.angularjs.org/1.6.6/angular-messages.min.js"></script>

<main ng-app="akyc" ng-controller="PassportController as $ctrl">
  <form name="$ctrl.form">

    <div name="lastName" ng-class="{ 'has-error': $ctrl.form.lastName.$invalid} ">
        <label for="pp-last-name">Surname</label>
        <div class="tip">Exactly as it appears on your passport</div>
        <div ng-messages="$ctrl.form.lastName.$error" ng-if="$ctrl.form.$submitted" id="last-name-error">
          <p ng-message="required">Please enter your last name</p>
          <p ng-message="maxlength">This field can be at most 31 characters long</p>
          <p ng-message="pattern">Only English letters, spaces and the following symbols ' - . are allowed</p>
        </div>
        
        <input type="text" id="pp-last-name" ng-model="$ctrl.details.lastName" name="lastName"
               class="form-control" required ng-pattern="$ctrl.nameRegex" ng-maxlength="31" aria-describedby="last-name-error" />
      </div>

      <button type="submit" class="btn btn-primary">Test</button>

  </form>
</main>
5

J'utilise:

/^(?:[\u00c0-\u01ffa-zA-Z'-]){2,}(?:\s[\u00c0-\u01ffa-zA-Z'-]{2,})+$/i

Et tester pour maxlength en utilisant d'autres moyens

3
malix
^\p{L}{2,}$

^ affirme sa position au début d'une ligne.

\ p {L} correspond à n'importe quel type de lettre de n'importe quelle langue

{2,} Quantifier - Correspond entre 2 fois et un nombre illimité de fois, autant de fois que possible, en rendant au besoin (gourmand)

$ affirme sa position à la fin d'une ligne

Il doit donc s'agir d'un nom dans n'importe quelle langue contenant au moins 2 lettres (ou symboles) sans chiffres ni autres caractères.

2
Mihail Fernandes

C'est ce que j'utilise. Cette expression régulière accepte uniquement les noms avec un minimum de caractères, de A-Z a-z ,space and -.

Exemple de noms: Ionut Ionete, Ionut-Ionete Cantemir, Ionete Ionut-Cantemirm Ionut-Cantemir Ionete-Second

La limite de caractère du nom est 3, si vous voulez générer cette modification {3,} à {6,}

([a-zA-Z\-]+){3,}\s+([a-zA-Z\-]+){3,}
2
Ionut Ionete

Donc, avec le client, nous créons cette regex folle:

(^$)|(^([^\-!#\$%&\(\)\*,\./:;\?@\[\\\]_\{\|\}¨ˇ“”€\+<=>§°\d\s¤®™©]| )+$)
1
Máťa - Stitod.cz

Pour le prénom et le nom, il n'y a vraiment que 2 choses que vous devriez rechercher:

  1. Longueur
  2. Contenu

Voici mon expression régulière:

var regex = /^[A-Za-z-,]{3,20}?=.*\d)/

1. Longueur

Ici, le {3,20} limite la longueur de la chaîne entre 3 et 20 caractères.

2. Conten

Les informations entre les crochets [A-Za-z] permettent les majuscules et les minuscules. Tous les symboles suivants (- ,.) sont également autorisés.

1
J Dorrian

Essayez ces solutions, pour une compatibilité maximale, comme je l’ai déjà posté ici :

JavaScript:

var nm_re = /^(?:((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-.\s])){1,}(['’,\-\.]){0,1}){2,}(([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-. ]))*(([ ]+){0,1}(((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-\.\s])){1,})(['’\-,\.]){0,1}){2,}((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-\.\s])){2,})?)*)$/;

HTML5:

<input type="text" name="full_name" id="full_name" pattern="^(?:((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-.\s])){1,}(['’,\-\.]){0,1}){2,}(([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-. ]))*(([ ]+){0,1}(((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-\.\s])){1,})(['’\-,\.]){0,1}){2,}((([^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]'’,\-\.\s])){2,})?)*)$" required>

0

L'expression suivante fonctionnera sur toute langue prise en charge par UTF-16 et garantira qu'il y a un minimum de deux composants au nom (c'est-à-dire le premier + le dernier), mais aussi autoriser un nombre quelconque de prénoms.

/^(\S+ )+\S+$/u

Au moment d'écrire ces lignes, il semble qu'aucune des autres réponses ne satisfasse à tous ces critères. Même ^\p{L}{2,}$, qui est le plus proche, manque, car il correspond également à des caractères "invisibles", tels que U+FEFF (Zero Width No-Break Space).

0
Gabriel Somoza