Expressão regular para nome e sobrenome


124

Para fins de validação do site, preciso da validação do nome e do sobrenome.

Para o primeiro nome, deve conter apenas letras, pode ter várias palavras com espaços e ter no mínimo três caracteres, mas no máximo 30 caracteres. Uma string vazia não deve ser validada (por exemplo , Jason , jason , jason smith , jason smith , JASON , Jason smith , jason Smith e jason SMITH ).

Para o sobrenome, deve ser uma única palavra, apenas letras, com no mínimo três caracteres, mas no máximo 30 caracteres. Strings vazias não devem ser validadas (por exemplo , lazslo , Lazslo e LAZSLO ).


10
E os primeiros nomes como 'Jo'?
2010

6
apenas uma observação: hífens são comuns em sobrenomes ... talvez haja sobrenomes com espaços também
tanascius

2
Nota: um validador de expressão regular irá ignorar entradas vazias: isso pode ou não ser o que você deseja.
Hans Ke st ing,

4
Se possível, a menos que você tenha um motivo surpreendentemente convincente para exigir um nome e sobrenome, basta fornecer um único campo "Nome". kalzumeus.com/2010/06/17/…
Chris,

Respostas:


195

Não se esqueça de nomes como:

  • Mathias d'Arras
  • Martin Luther King Júnior.
  • Hector Sausage-Hausen

Isso deve funcionar para a maioria das coisas:

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

OU Suporte nomes internacionais com Unicode super sweet:

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


4
Eu escaparia dos caracteres especiais nessas expressões regulares - especialmente .(ponto decimal / ponto / ponto final), pois é o caractere curinga regexp =)
Joel Purra

30
Você não pode validar todos os caracteres nacionais possíveis. Por exemplo, caracteres húngaros őŐűŰestão faltando, łŁassim como caracteres poloneses , para não mencionar vários caracteres lituanos e letões. Em vez disso, tente encontrar uma biblioteca que transforme os caracteres exóticos na versão adequada sem sotaque e, em seguida, escreva a /^[a-z ,.'-]+$/iregexp.
gaborsch

69
Então, 陳大文não é um nome válido aqui?
Alvin Wong

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

4
AZ não precisa ser incluído no exemplo original porque o modificador i após a expressão significa ignorar maiúsculas e minúsculas.
mhanney de

73

Você faz suposições falsas sobre o formato do nome e do sobrenome. Provavelmente, é melhor não validar o nome, exceto verificar se ele está vazio.


deveria ter sido um comentário.
Demência

32

Depois de passar por todas essas respostas, descobri uma maneira de construir um pequeno regex que suporta a maioria dos idiomas e permite apenas caracteres de palavras. Ele ainda oferece suporte a alguns caracteres especiais, como hífens, espaços e apóstrofos. Eu testei em python e ele suporta os caracteres abaixo:

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

Caracteres suportados:

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

2
De todas as respostas, esta funcionou perfeitamente usando o ng 4.
Deniss M.

1
Sua regex falha em uma string de 2 caracteres. Eu acho que isso resolveu^[\w'\-,.]*[^_!¡?÷?¿\/\\+=@#$%ˆ&*(){}|~<>;:[\]]*$
TKA

Personagens nacionais são suportados, mas não na primeira posição. Eu mudaria a expressão para^[^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$
TOUDIdel

18

Eu criei um regex personalizado para lidar com nomes:

Eu tentei esses tipos de nomes e descobri que funcionam perfeitamente

  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

Meu RegEx se parece com isto:

^([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 -)") ]

Observe o duplo \\ para caracteres de escape

Para aqueles que são novos no RegEx, pensei em incluir uma explicação.

^               // 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

Eu tenho um teste de unidade que testa vários nomes, depois várias coisas que não são nomes. A lista de nomes não tem 'token de teste' como a primeira entrada. Isso corresponde a isso.
Rob

É quase o que eu procurava. Eu acho (talvez errado) que você é um cara francês. E um caso que você pode encontrar em francês não é manipulador: nomes compostos, como Jean-Pierre, Marie-Charlotte, etc ... Sou novo em reg exp, mas acho que um -? como você fez para o sobrenome, entre as 2 primeiras palavras, poderia dar conta do recado.
Linpter

Olá, Linpter, Não sou francês, mas tenho um nome francês. Sim. Eu não testei isso, no entanto, você deve ser capaz de adicionar o - no primeiro [], então mude: ^ ([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,})?)
François Muller

16

Eu pesquisei e pesquisei e brinquei e brinquei com ele e, embora não seja perfeito, ele pode ajudar outras pessoas na tentativa de validar nomes e sobrenomes que foram fornecidos como uma variável.

No meu caso, essa variável é $ name.

Usei o seguinte código para meu 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

Estou aprendendo RegEx, mas tenho a explicação para o código fornecida pelo amigo RegEx.
Aqui está:

Afirmar a posição em um limite de palavra «\ b»

Combine a expressão regular abaixo e capture sua correspondência no número de referência anterior 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 e 5 vezes, tantas vezes quanto possível, retribuindo conforme necessário (ganancioso) «{2,5}»

* PRECISO DE AJUDA AQUI PARA ENTENDER AS RAMIFICAÇÕES DESTA NOTA *

Nota: Eu repeti o próprio grupo de captura. O grupo irá capturar apenas a última iteração. Coloque um grupo de captura ao redor do grupo repetido para capturar todas as iterações. «{2,5}»

Corresponde à expressão regular abaixo (tentando a próxima alternativa apenas se esta falhar) «[AZ] {1} [az] {1,30} [-] {0,1}»

Corresponde a um único caractere no intervalo entre “A” e “Z” «[AZ] {1}»

Exatamente 1 vez «{1}»

Corresponde a um único caractere no intervalo entre “a” e “z” «[az] {1,30}»

Entre uma e 30 vezes, tantas vezes quanto possível, retribuindo conforme necessário (ganancioso) «{1,30}»

Corresponde a um único caractere presente na lista “-” «[-] {0,1}»

Entre zero e uma vez, tantas vezes quanto possível, retribuindo conforme necessário (ganancioso) «{0,1}»

Ou corresponda à expressão regular número 2 abaixo (tentando a próxima alternativa apenas se esta falhar) «[AZ] {1} [- \ '] {1} [AZ] {0,1} [az] {1,30} [ -] {0,1} »

Corresponde a um único caractere no intervalo entre “A” e “Z” «[AZ] {1}»

Exatamente 1 vez «{1}»

Corresponde a um único caractere presente na lista abaixo «[- \ '] {1}»

Exatamente 1 vez «{1}»

Um dos caracteres “-” «-» Um 'caractere «\'»

Corresponde a um único caractere no intervalo entre “A” e “Z” «[AZ] {0,1}»

Entre zero e uma vez, tantas vezes quanto possível, retribuindo conforme necessário (ganancioso) «{0,1}»

Corresponde a um único caractere no intervalo entre “a” e “z” «[az] {1,30}»

Entre uma e 30 vezes, tantas vezes quanto possível, retribuindo conforme necessário (ganancioso) «{1,30}»

Corresponde a um único caractere presente na lista “-” «[-] {0,1}»

Entre zero e uma vez, tantas vezes quanto possível, retribuindo conforme necessário (ganancioso) «{0,1}»

Ou corresponda à expressão regular número 3 abaixo (o grupo inteiro falha se este não corresponder) «[az] {1,2} [- \ '] {1} [AZ] {1} [az] {1,30} »

Corresponde a um único caractere no intervalo entre “a” e “z” «[az] {1,2}»

Entre uma e 2 vezes, tantas vezes quanto possível, retribuindo conforme necessário (ganancioso) «{1,2}»

Corresponde a um único caractere no intervalo entre “” e “'” «[- \'] {1}»

Exatamente 1 vez «{1}»

Corresponde a um único caractere no intervalo entre “A” e “Z” «[AZ] {1}»

Exatamente 1 vez «{1}»

Corresponde a um único caractere no intervalo entre “a” e “z” «[az] {1,30}»

Entre uma e 30 vezes, tantas vezes quanto possível, retribuindo conforme necessário (ganancioso) «{1,30}»

Eu sei que esta validação assume totalmente que cada pessoa que preenche o formulário tem um nome ocidental e isso pode eliminar a grande maioria das pessoas no mundo. No entanto, sinto que este é um passo na direção certa. Talvez essa expressão regular seja muito básica para os gurus abordarem de forma simplista ou talvez haja algum outro motivo pelo qual não consegui encontrar o código acima em minhas pesquisas. Passei muito tempo tentando descobrir isso, você provavelmente perceberá como minha mente está nebulosa com tudo isso se olhar os nomes dos meus testes abaixo.

Testei o código com os nomes a seguir e os resultados estão entre parênteses à direita de cada nome.

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

Se você tiver nomes básicos, deve haver mais de um até cinco para que o código acima funcione, que são semelhantes aos que usei durante o teste, este código pode ser para você.

Se você tiver alguma melhoria, por favor me avise. Estou apenas nos estágios iniciais (primeiros meses para descobrir o RegEx.

Obrigado e boa sorte Steve


1
Coisas como "The Fourth" ou "IV" funcionam com isso?
majidarif

11

O primeiro nome seria

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

Se você precisa que a parte inteira do primeiro nome tenha menos de 30 letras, você precisa verificar isso separadamente, eu acho. A expressão".{3,30}" deve fazer isso.

Seus requisitos de sobrenome se traduziriam em

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

mas você deve verificar isso. Existem muitos sobrenomes contendo espaços.


Isso verifica se há espaços entre?
Y_Y

2
E O'Connor ? O apóstrofo também precisa ser incluído.
astronauta de

1
Muito incompleto. O primeiro nome pode ser "Jean-Claude" com hífen. O sobrenome pode ser "D'arc" com aspas. Além disso, e se "François" for o primeiro nome?
Bart

1
E quanto a "Al"? Primeiro nome válido. Apenas duas letras. E os nomes em chinês, russo, hindi? E os nomes europeus?
Christian Hujer

isso não funcionaria para muitos nomes não ingleses ou (não latinos?)
oldboy

7

Como disse maček:

Não se esqueça de nomes como:

Mathias d'Arras

Martin Luther King Júnior.

Hector Sausage-Hausen

e para remover casos como:

..Mathias

Martin king, Jr.-

Isso abrangerá mais casos:

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

Se eu quiser limitar o comprimento de meus caracteres, qual será o código para isso?
G.Abhisek

1
Sim, Martin Luther King Jr. retorna como uma partida, assim como o Rei Henry VIII.
Steve Kinzey

7

Estou trabalhando no aplicativo que valida passaportes internacionais (ICAO). Oferecemos suporte apenas para caracteres em inglês. Embora a maioria dos caracteres nacionais estrangeiros possam ser representados por um caractere do alfabeto latino, por exemplo, è por e, existem vários caracteres nacionais que exigem uma letra extra para representá-los, como o trema alemão, que exige que um 'e' seja adicionado à letra por exemplo, ä por ae.

Este é o JavaScript Regex para os nomes e sobrenomes que usamos:

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

O número máximo de caracteres no passaporte internacional é de até 31 . Usamos maxlength = "31" para melhorar as mensagens de erro do word em vez de incluí-lo no regex.

Aqui está um snippet de nosso código em AngularJS 1.6 com formulário e tratamento de erros:

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 você não usou meu Regex. Use isto: / ^ [a-zA-Z '.-] * $ /
Alexander Burakevych

5

Eu uso:

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

E teste o comprimento máximo usando alguns outros meios


5

Este regex funciona para mim (estava usando no Angular 8):

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

insira a descrição da imagem aqui

Será inválido se houver: -

  1. Qualquer espaço em branco no início ou no final do nome
  2. Símbolos obtidos, por exemplo, @
  3. Menos de 2 ou mais de 30

Exemplo de primeiro nome inválido (espaço em branco)

insira a descrição da imagem aqui

Exemplo de primeiro nome válido:

insira a descrição da imagem aqui


6
E 'Björk Guðmundsdóttir'?
Mariusz Jamro

4

Para simplificar, você pode usar:

(.*)\s(.*)

O que eu gosto sobre isso é que o sobrenome vem sempre depois do primeiro nome, então se você for inserir esses grupos correspondentes em um banco de dados e o nome for John M. Smith, o primeiro grupo será John M. , e o segundo grupo será Smith.


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

^ afirma a posição no início de uma linha.

\ p {L} corresponde a qualquer tipo de letra de qualquer idioma

{2,} Quantificador - Corresponde entre 2 e vezes ilimitadas, tantas vezes quanto possível, retribuindo conforme necessário (ganancioso)

$ afirma a posição no final de uma linha

Portanto, deve ser um nome em qualquer idioma contendo pelo menos 2 letras (ou símbolos) sem números ou outros caracteres.


tenha em mente que alguns caracteres como 'e - são válidos nos nomes.
Mathijs Segers de

1

Então, com o cliente, criamos este regex louco:

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

1

Para nomes e sobrenomes, existem apenas 2 coisas que você deve procurar:

  1. comprimento
  2. Conteúdo

Aqui está minha expressão regular:

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

1. Comprimento

Aqui, o {3,20} restringe o comprimento da string entre 3 e 20 caracteres.

2. Conteúdo

A informação entre os colchetes [A-Za-z] permite caracteres maiúsculos e minúsculos. Todos os símbolos subsequentes (- ,.) também são permitidos.


1

É isso que eu uso.

Este regex aceita apenas nomes com caracteres mínimos, de A-Z a-z ,space and -.

Exemplo de nomes:

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

O limite do caractere do nome é 3. Se você quiser alterar isso, modifique {3,} para {6,}

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

2
E sobre ä å ö Ä Å Ö etc? Muito comum em nomes suecos. O sobrenome O'Conner também falhará e nomes duplos também causarão problemas. Isso será muito frustrante para pessoas que têm nomes válidos.
Wilt de

E o apóstrofo em nomes como O'Connor?
Fogmeister

minha expressão retorna Michael Jordan O'Reilly Jr. como um nome válido
Steve Kinzey

0

A expressão a seguir funcionará em qualquer linguagem compatível com UTF-16 e garantirá que haja no mínimo dois componentes para o nome (ou seja, primeiro + último), mas também permitirá qualquer número de nomes do meio.

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

No momento em que este livro foi escrito, parecia que nenhuma das outras respostas atendia a todos esses critérios. Even ^\p{L}{2,}$, que é o mais próximo, fica aquém porque também corresponderá a caracteres "invisíveis", como U+FEFF(Zero Width No-Break Space).


não passa javascript para regexr.com 1) avisando que o recurso Unicode pode não ser compatível com todos os navegadores. 2) também está permitindo números na regex. exemplo: michael dimmittsasd2123123
Michael Dimmitt

0

Experimente essas soluções, para máxima compatibilidade, como já postei aqui :

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

Isso parece fazer o trabalho para mim:

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

-1

Uma função simples usando preg_match em 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

Nome completo com apenas um espaço em branco:

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

-2

Se você quiser que o nome completo tenha entre 3 e 30 caracteres, sem restrições a palavras individuais, tente o seguinte:

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

Esteja ciente de que isso exclui todas as letras estrangeiras como é, è, à, ï.

Se você quiser que o limite de 3 a 30 caracteres se aplique a cada palavra individual, Jens regexp fará o trabalho.


-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; 
} 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.