Expresión regular para nombre y apellido


124

Para fines de validación del sitio web, necesito la validación del nombre y apellido.

Para el nombre, solo debe contener letras, puede tener varias palabras con espacios y tener un mínimo de tres caracteres, pero un máximo de 30 caracteres superiores. Una cadena vacía no debe validarse (por ejemplo , Jason , jason , jason smith , jason smith , JASON , Jason smith , jason Smith y jason SMITH ).

Para el apellido, debe ser una sola palabra, solo letras, con al menos tres caracteres, pero como máximo 30 caracteres. Las cadenas vacías no deben validarse (por ejemplo , lazslo , Lazslo y LAZSLO ).


10
¿Qué pasa con los nombres como 'Jo'?
2010

6
solo un comentario: los guiones son comunes en los apellidos ... tal vez también haya apellidos con espacios
tanascius

2
Nota: un validador de expresión regular ignorará las entradas vacías: esto podría ser o no lo que usted desea.
Hans Ke st ing

4
Si es posible, a menos que tenga una razón increíblemente convincente para requerir un nombre y apellido, solo proporcione un solo campo "Nombre". kalzumeus.com/2010/06/17/…
Chris

Respuestas:


195

No te olvides de nombres como:

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

Esto debería funcionar para la mayoría de las cosas:

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

O admite nombres internacionales con unicode súper dulce:

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


4
Me escaparía de los caracteres especiales en estas expresiones regulares, especialmente .(punto decimal / punto / punto) ya que es el comodín de
expresión regular

30
No se pueden validar todos los caracteres nacionales posibles. Por ejemplo őŐűŰ, faltan caracteres húngaros , caracteres polacos łŁtambién, sin mencionar varios caracteres lituanos y letones. Más bien, intente encontrar una biblioteca que transforme los personajes exóticos en la versión adecuada sin acento, luego escriba la /^[a-z ,.'-]+$/iexpresión regular.
gaborsch

69
Entonces, ¿ 陳大文no es un nombre válido aquí?
Alvin Wong

16
Para Unicode, use /^[\p{L}'][ \p{L}'-]*[\p{L}]$/u, aunque sea bastante indulgente.
Frederik Krautwald

4
AZ no necesita incluirse en el ejemplo original porque el modificador i después de la expresión significa ignorar mayúsculas y minúsculas.
mhanney

73

Hace suposiciones falsas sobre el formato del nombre y apellido. Probablemente sea mejor no validar el nombre en absoluto, además de verificar que esté vacío.


debería haber sido un comentario.
Dementic

32

Después de revisar todas estas respuestas, encontré una manera de crear una pequeña expresión regular que admita la mayoría de los idiomas y solo permita caracteres de palabras. Incluso admite algunos caracteres especiales como guiones, espacios y apóstrofos. He probado en Python y admite los siguientes caracteres:

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

Caracteres admitidos:

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

2
De todas las respuestas, esta funcionó a la perfección con ng 4.
Deniss M.

1
Su expresión regular falla en una cadena de 2 caracteres. Creo que esto lo solucionó^[\w'\-,.]*[^_!¡?÷?¿\/\\+=@#$%ˆ&*(){}|~<>;:[\]]*$
TKA

Se admiten caracteres nacionales, pero no en la primera posición. Cambiaría la expresión a^[^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$
TOUDIdel

18

He creado una expresión regular personalizada para tratar con nombres:

Probé este tipo de nombres y encontré que funcionan perfectamente

  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

Mi expresión regular se ve así:

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

Modelo 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 -)") ]

Tenga en cuenta el doble \\para los caracteres de escape

Para aquellos de ustedes que son nuevos en RegEx, pensé en incluir una explicación.

^               // start of line
[a-zA-Z]{2,}    // will except a name with at least two characters
\s              // will look for white space between name and surname
[a-zA-Z]{1,}    // needs at least 1 Character
\'?-?           // possibility of **'** or **-** for double barreled and hyphenated surnames
[a-zA-Z]{2,}    // will except a name with at least two characters
\s?             // possibility of another whitespace
([a-zA-Z]{1,})? // possibility of a second surname

Tengo una prueba unitaria que prueba varios nombres, luego varias cosas que no son nombres. La lista de no nombres tiene un "token de prueba" como primera entrada. Esto coincide con eso.
Rob

Es casi lo que estaba buscando. Supongo (quizás erróneamente) que eres un francés. Y un caso no es el que puedes encontrar en francés: nombres compuestos, como Jean-Pierre, Marie-Charlotte, etc ... Soy nuevo en reg exp pero supongo que -? como hiciste con el apellido, entre las 2 primeras palabras, podría hacer el trabajo.
Linpter

Hola Linpter, no francés, sin embargo tengo un nombre francés. Si. No he probado esto, sin embargo, debería poder agregar el - en el primer [] así que cambie: ^ ([a-zA-Z] {2,} \ s [a-zA-z] {1,} ' ? -? [a-zA-Z] {2,} \ s? ([a-zA-Z] {1,})?) TO: ^ ([a-zA-Z -] {2,} \ s [a-zA-z] {1,} '? -? [a-zA-Z] {2,} \ s? ([a-zA-Z] {1,})?)
Francois Muller

16

He buscado y buscado y jugado y jugado con él y, aunque no es perfecto, puede ayudar a otros a intentar validar los nombres y apellidos que se han proporcionado como una variable.

En mi caso, esa variable es $ name.

Usé el siguiente código para mi 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

Estoy aprendiendo RegEx yo mismo, pero tengo la explicación del código proporcionada por RegEx buddy.
Aquí está:

Afirmar la posición en el límite de una palabra «\ b»

Haga coincidir la expresión regular a continuación y capture su coincidencia en el número de referencia inversa 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 y 5 veces, tantas veces como sea posible, devolviendo según sea necesario (codicioso) «{2,5}»

* NECESITO AYUDA AQUÍ PARA ENTENDER LAS RAMIFICACIONES DE ESTA NOTA *

Nota: repetí el grupo de captura en sí. El grupo capturará solo la última iteración. Coloque un grupo de captura alrededor del grupo repetido para capturar todas las iteraciones. «{2,5}»

Coincide con la expresión regular de abajo (intentando la siguiente alternativa solo si esta falla) «[AZ] {1} [az] {1,30} [-] {0,1}»

Coincide con un solo carácter en el rango entre "A" y "Z" «[AZ] {1}»

Exactamente 1 vez «{1}»

Coincide con un solo carácter en el rango entre "a" y "z" «[az] {1,30}»

Entre una y 30 veces, tantas veces como sea posible, devolviendo según sea necesario (codicioso) «{1,30}»

Coincide con un solo carácter presente en la lista “-” «[-] {0,1}»

Entre cero y una, tantas veces como sea posible, devolviendo según sea necesario (codicioso) «{0,1}»

O haga coincidir la expresión regular número 2 a continuación (intente la siguiente alternativa solo si ésta falla) «[AZ] {1} [- \ '] {1} [AZ] {0,1} [az] {1,30} [ -] {0,1} »

Coincide con un solo carácter en el rango entre "A" y "Z" «[AZ] {1}»

Exactamente 1 vez «{1}»

Coincide con un solo carácter presente en la lista a continuación «[- \ '] {1}»

Exactamente 1 vez «{1}»

Uno de los caracteres “-” «-» Un 'carácter «\'»

Coincide con un solo carácter en el rango entre "A" y "Z" «[AZ] {0,1}»

Entre cero y una, tantas veces como sea posible, devolviendo según sea necesario (codicioso) «{0,1}»

Coincide con un solo carácter en el rango entre "a" y "z" «[az] {1,30}»

Entre una y 30 veces, tantas veces como sea posible, devolviendo según sea necesario (codicioso) «{1,30}»

Coincide con un solo carácter presente en la lista “-” «[-] {0,1}»

Entre cero y una, tantas veces como sea posible, devolviendo según sea necesario (codicioso) «{0,1}»

O haga coincidir la expresión regular número 3 a continuación (todo el grupo falla si esta no coincide) «[az] {1,2} [- \ '] {1} [AZ] {1} [az] {1,30} »

Coincide con un solo carácter en el rango entre "a" y "z" «[az] {1,2}»

Entre una y 2 veces, tantas veces como sea posible, devolviendo según sea necesario (codicioso) «{1,2}»

Coincide con un solo carácter en el rango entre “” y “'” «[- \'] {1}»

Exactamente 1 vez «{1}»

Coincide con un solo carácter en el rango entre "A" y "Z" «[AZ] {1}»

Exactamente 1 vez «{1}»

Coincide con un solo carácter en el rango entre "a" y "z" «[az] {1,30}»

Entre una y 30 veces, tantas veces como sea posible, devolviendo según sea necesario (codicioso) «{1,30}»

Sé que esta validación asume totalmente que cada persona que completa el formulario tiene un nombre occidental y eso puede eliminar a la gran mayoría de personas en el mundo. Sin embargo, siento que este es un paso en la dirección correcta. Quizás esta expresión regular sea demasiado básica para que los gurús la aborden de manera simplista o quizás haya alguna otra razón por la que no pude encontrar el código anterior en mis búsquedas. Pasé demasiado tiempo tratando de resolver esto, probablemente notarás cuán confusa está mi mente sobre todo esto si miras los nombres de mis pruebas a continuación.

Probé el código en los siguientes nombres y los resultados están entre paréntesis a la derecha de cada nombre.

  1. STEVE SMITH (falla)
  2. Stev3 Smith (falla)
  3. STeve Smith (falla)
  4. Steve SMith (falla)
  5. Steve Sm1th (pasó el Steve Sm)
  6. d'Are to Beaware (pasado el Are to Beaware)
  7. Jo Blow (pasado)
  8. Hyoung Kyoung Wu (fallecido)
  9. Mike O'Neal (pasado)
  10. Steve Johnson-Smith (aprobado)
  11. Jozef-Schmozev Hiemdel (aprobado)
  12. Oh Henry Smith (pasado)
  13. Mathais d'Arras (pasado)
  14. Martin Luther King Jr (aprobado)
  15. Centro-James Brown (aprobado)
  16. Darren McCarty (aprobado)
  17. George De FunkMaster (aprobado)
  18. Baloncesto Kurtis B-Ball (aprobado)
  19. Ahmad el Jeffe (fallecido)

Si tiene nombres básicos, debe haber más de uno hasta cinco para que funcione el código anterior, que son similares a los que usé durante las pruebas, este código podría ser para usted.

Si tiene alguna mejora, hágamelo saber. Solo estoy en las primeras etapas (los primeros meses de descubrir RegEx.

Gracias y buena suerte, Steve.


1
¿Funcionarían cosas como "El Cuarto" o "IV" con esto?
majidarif

11

El primer nombre sería

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

Si necesita que toda la parte del nombre tenga menos de 30 letras, creo que debe verificarlo por separado. La expresión ".{3,30}"debería hacer eso.

Los requisitos de su apellido se traducirían en

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

pero deberías comprobarlos. Hay muchos apellidos que contienen espacios.


¿Esto busca espacios entre ellos?
Y_Y

2
¿Y O'Connor ? El apóstrofe también debe incluirse.
astronauta

1
Bastante incompleto. El primer nombre podría ser "Jean-Claude" con guión. El apellido podría ser "D'arc" con comillas. Además, ¿qué pasa si "François" es el primer nombre?
Bart

1
¿Qué pasa con "Al"? Nombre válido. Solo dos letras. ¿Qué pasa con los nombres chinos, rusos e hindi? ¿Qué pasa con los nombres europeos?
Christian Hujer

este trabajo wouldnt para un montón de no-Inglés o (? no latinos) Nombres
oldboy

7

Como dijo maček:

No te olvides de nombres como:

Mathias d'Arras

Martin Luther King hijo.

Hector Sausage-Hausen

y para eliminar casos como:

..Mathias

Martin king, Jr.-

Esto cubrirá más casos:

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

Si quiero limitar la longitud de mis caracteres, ¿cuál podría ser el código para eso?
G.Abhisek

1
Sí, Martin Luther King Jr. regresa como un partido, y también el rey Enrique VIII.
Steve Kinzey

7

Estoy trabajando en la aplicación que valida los pasaportes internacionales (OACI). Solo admitimos caracteres en inglés. Si bien la mayoría de los caracteres nacionales extranjeros pueden estar representados por un carácter en el alfabeto latino, por ejemplo, è por e, hay varios caracteres nacionales que requieren una letra adicional para representarlos, como la diéresis alemana, que requiere que se agregue una 'e' a la letra. por ejemplo, ä por ae.

Este es el JavaScript Regex para el nombre y apellido que usamos:

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

El número máximo de caracteres en el pasaporte internacional es de 31 . Usamos maxlength = "31" para mejorar los mensajes de error de palabras en lugar de incluirlos en la expresión regular.

Aquí hay un fragmento de nuestro código en AngularJS 1.6 con manejo de formularios y errores:

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>


@danieltakeshi, no usaste mi expresión regular. Use esto: / ^ [a-zA-Z '.-] * $ /
Alexander Burakevych

5

Yo suelo:

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

Y pruebe la longitud máxima utilizando otros medios


5

Esta expresión regular funciona para mí (estaba usando en Angular 8):

([a-zA-Z',.-]+( [a-zA-Z',.-]+)*){2,30}

ingrese la descripción de la imagen aquí

No será válido si hay: -

  1. Cualquier inicio o final de espacio en blanco del nombre
  2. Tengo símbolos, por ejemplo, @
  3. Menos de 2 o más de 30

Ejemplo de nombre no válido (espacios en blanco)

ingrese la descripción de la imagen aquí

Ejemplo de nombre válido:

ingrese la descripción de la imagen aquí


6
¿Qué pasa con 'Björk Guðmundsdóttir'?
Mariusz Jamro

4

En aras de la simplicidad, puede utilizar:

(.*)\s(.*)

Lo que me gusta de esto es que el apellido siempre está después del nombre, por lo que si va a ingresar estos grupos coincidentes en una base de datos y el nombre es John M. Smith, el primer grupo será John M. , y el segundo grupo será Smith.


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

^ afirma la posición al comienzo de una línea.

\ p {L} coincide con cualquier tipo de letra de cualquier idioma

{2,} Cuantificador: coincide entre 2 y un número ilimitado de veces, tantas veces como sea posible, devolviendo según sea necesario (codicioso)

$ afirma la posición al final de una línea

Por lo tanto, debe ser un nombre en cualquier idioma que contenga al menos 2 letras (o símbolos) sin números ni otros caracteres.


tenga en cuenta que algunos caracteres como 'y - son válidos en los nombres.
Mathijs Segers

1

Entonces, con el cliente creamos esta expresión regular loca:

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

1

Para nombres y apellidos, en realidad solo hay 2 cosas que debe buscar:

  1. Longitud
  2. Contenido

Aquí está mi expresión regular:

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

1. Longitud

Aquí el {3,20} restringe la longitud de la cadena entre 3 y 20 caracteres.

2. Contenido

La información entre corchetes [A-Za-z] permite caracteres en mayúsculas y minúsculas. También se permiten todos los símbolos posteriores (- ,.).


1

Esto es lo que utilizo.

Esta expresión regular solo acepta nombres con caracteres mínimos, desde A-Z a-z ,space and -.

Ejemplo de nombres:

Ionut Ionete, Ionut-Ionete Cantemir, Ionete Ionut-Cantemirm Ionut-Cantemir Ionete-Second

El límite de caracteres del nombre es 3. Si desea cambiar esto, modifique {3,} a {6,}

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

2
¿Qué pasa con ä å ö Ä Å Ö etc.? Muy común en los nombres suecos. El apellido O'Conner también fallará y los nombres de doble cañón también darán problemas. Esto será muy frustrante para las personas que tienen nombres tan válidos.
March

¿Qué pasa con el apóstrofe en nombres como O'Connor?
Fogmeister

mi expresión devuelve Michael Jordan O'Reilly Jr. como un nombre válido
Steve Kinzey

0

La siguiente expresión funcionará en cualquier idioma compatible con UTF-16 y garantizará que haya un mínimo de dos componentes en el nombre (es decir, primero + apellido), pero también permitirá cualquier número de segundos nombres.

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

En el momento de escribir este artículo, parece que ninguna de las otras respuestas cumple con todos esos criterios. Incluso ^\p{L}{2,}$, que es el más cercano, se queda corto porque también coincidirá con caracteres "invisibles", como U+FEFF(Espacio sin interrupciones de ancho cero).


no pasa javascript para regexr.com 1) advirtiendo que la función Unicode puede no ser compatible con todos los navegadores. 2) también permite números en la expresión regular. ejemplo: michael dimmittsasd2123123
Michael Dimmitt

0

Pruebe estas soluciones, para obtener la máxima compatibilidad, como ya he publicado aquí :

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

Esto parece hacer el trabajo por mí:

[\S]{2,} [\S]{2,}( [\S]{2,})*

-1

Una función simple usando preg_match en php

<?php
function name_validation($name) {
    if (!preg_match("/^[a-zA-Z ]*$/", $name) === false) {
        echo "$name is a valid name";
    } else {
        echo "$name is not a valid name";
    }
}

//Test
name_validation('89name');
?>

-1

Nombre completo con un solo espacio en blanco:

^[a-zA-Z'\-\pL]+(?:(?! {2})[a-zA-Z'\-\pL ])*[a-zA-Z'\-\pL]+$

-2

Si desea que el nombre completo tenga entre 3 y 30 caracteres sin restricciones en palabras individuales, intente esto:

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

Tenga en cuenta que excluye todas las letras extranjeras como é, è, à, ï.

Si desea que se aplique el límite de 3 a 30 caracteres a cada palabra individual, Jens regexp hará el trabajo.


-2
var name = document.getElementById('login_name').value; 
if ( name.length < 4  && name.length > 30 )
{
    alert ( 'Name length is mismatch ' ) ;
} 


var pattern = new RegExp("^[a-z\.0-9 ]+$");
var return_value = var pattern.exec(name);
if ( return_value == null )
{
    alert ( "Please give valid Name");
    return false; 
} 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.