Eu quero uma expressão regular para verificar isso
a senha deve ter oito caracteres, incluindo uma letra maiúscula, um caractere especial e caracteres alfanuméricos.
E aqui está minha expressão de validação que é para oito caracteres, incluindo uma letra maiúscula, uma letra minúscula e um número ou caractere especial.
(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$"
Como posso escrever para uma senha de oito caracteres, incluindo uma letra maiúscula, um caractere especial e caracteres alfanuméricos?
Respostas:
A expressão regular que você procura provavelmente será enorme e um pesadelo de se manter, especialmente para pessoas que não estão familiarizadas com expressões regulares.
Acho que seria mais fácil quebrar sua regex e fazer isso um pouco de cada vez. Pode demorar um pouco mais, mas tenho certeza de que mantê-lo e depurá-lo seria mais fácil. Isso também permitiria que você fornecesse mensagens de erro mais direcionadas aos seus usuários (além de apenas
Invalid Password
), o que deve melhorar a experiência do usuário.Pelo que estou vendo, você é bastante fluente em regex, então presumo que fornecer as expressões regulares para fazer o que você precisa seria inútil.
Vendo seu comentário, é assim que eu faria:
Deve ter oito caracteres: você não precisa de uma regex para isso. Usar a
.Length
propriedade deve ser suficiente.Incluindo uma letra maiúscula: você pode usar a
[A-Z]+
expressão regular. Se a string contiver pelo menos uma letra maiúscula, essa expressão regular resultarátrue
.Um caractere especial: Você pode usar o
\W
que corresponderá a qualquer caractere que não seja uma letra ou um número ou então, você pode usar algo assim[!@#]
para especificar uma lista personalizada de caracteres especiais. Nota que embora personagens como$
,^
,(
e)
são caracteres especiais na linguagem de expressão regular, então eles precisam ser escapado assim:\$
. Resumindo, você pode usar o\W
.Caracteres alfanuméricos: o uso de
\w+
deve corresponder a qualquer letra, número e sublinhado.Dê uma olhada neste tutorial para obter mais informações.
fonte
Em uma linha:
Editar 28/05/2019:
Você precisa corresponder a toda a string de entrada. Portanto, você pode delimitar a regex entre
^
e$
para evitar assumir acidentalmente correspondências parciais como correspondendo à entrada inteira:Fontes:
Expressão de correspondência de senha
Validação de força de senha com expressões regulares
fonte
^
e$
. Tente isto:^((?=.*\d)(?=.*[A-Z])(?=.*\W).{8,8})$
Tantas respostas .... todas ruins!
Expressões regulares não têm um operador AND, então é muito difícil escrever uma regex que corresponda a senhas válidas, quando a validade é definida por algo E algo mais E algo mais ...
Mas, expressões regulares fazem têm um operador OR, por isso, basta aplicar o teorema de DeMorgan, e escrever um regex que corresponde inválidos senhas.
qualquer coisa com menos de 8 caracteres OU qualquer coisa sem números OU qualquer coisa sem maiúsculas OU qualquer coisa sem caracteres especiais
Assim:
Se alguma coisa corresponder a isso, é uma senha inválida .
fonte
|.{9,}
. +1 para o conceitoA resposta é não usar uma expressão regular. Isso é jogos e contagem.
As expressões regulares são uma questão de ordem.
Em sua vida como programador, você terá que fazer muitas coisas que não fazem sentido. Aprenda a cavar um nível mais profundo. Aprenda quando a pergunta está errada.
A pergunta (se mencionou expressões regulares) está errada.
Pseudocódigo (tem alternado entre muitas linguagens, ultimamente):
Aposto que você leu e entendeu o código acima quase instantaneamente. Aposto que você demorou muito mais com a regex e tem menos certeza de que está correto. Estender a regex é arriscado. Estendeu o imediato acima, muito menos.
Observe também que a pergunta foi formulada de maneira imprecisa. O conjunto de caracteres é ASCII ou Unicode ou ?? Meu palpite, ao ler a pergunta, é que pelo menos um caractere minúsculo é assumido. Portanto, acho que a última regra assumida deve ser:
(Mudar de chapéu para focado na segurança, esta é uma regra realmente irritante / inútil.)
Aprender a saber quando a pergunta está errada é muito mais importante do que respostas inteligentes. Uma resposta inteligente para a pergunta errada quase sempre está errada.
fonte
Como um exemplo de como isso poderia ser feito com um regex legível / sustentável.
Para uma regex mais longa, você sempre deve usar
RegexOptions.IgnorePatternWhitespace
para permitir espaços em branco e comentários na expressão para melhor legibilidade.fonte
lookahead assertion
tipo de um padrão "and" para cobrir toda a restrição em uma única regex. Funciona para mais restrições e pode ser facilmente gerado se algumas restrições forem habilitadas / desabilitadas pela configuração.Se você precisar de apenas uma caixa alta e um caractere especial, isso deve funcionar:
fonte
AAaaaaaaa#
não está bem de acordo com esta expressãoA expressão regular que você estava procurando:
/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*\[\]"\';:_\-<>\., =\+\/\\]).{8,}$/u
.Exemplo e teste: http://regexr.com/3fhr4
fonte
.
antes do{8,}
para[^\s]
.Esta pergunta começa a ser viral e aparecem muitas sugestões interessantes.
Sim, escrever à mão é difícil. Portanto, uma solução mais fácil é usar um modelo. Embora o regex resultante possa não ser o ideal, será mais fácil manter e / ou alterar, e o usuário terá um melhor controle sobre o resultado. É possível que eu tenha perdido alguma coisa, então qualquer crítica construtiva será útil.
Estes links podem ser interessantes: corresponder a pelo menos 2 dígitos 2 letras em qualquer ordem em uma string , Linguagem de Expressão Regular , Grupos de captura
Estou usando este modelo com
(?=(?:.*?({type})){({count})})
base em todas as regex que vi no SO. A próxima etapa é substituir o padrão necessário (number
,special character
...) e adicionar configuração para comprimento.Eu fiz uma pequena classe para compor o regex PasswordRegexGenerator.cs Um exemplo:
fonte
Você pode usar a classe abaixo para validação:
onde 6 e 20 são os tamanhos mínimo e máximo para a senha.
fonte
(?>{8,})
(?<=...)
(?<=\p{Lu}.*)
(?<=\W.*)
(?<=\w.*)
Resumido:
(?>.{8,})(?<=\p{Lu}.*)(?<=\W.*)(?<=\w.*)
fonte
O melhor é não usar regex para tudo. Esses requisitos são muito leves. Em operações de string baseadas na CPU para verificar os critérios / validação é muito mais barato e rápido do que regex!
fonte
fonte