web-dev-qa-db-fra.com

Mot de passe REGEX avec au moins 6 caractères, au moins une lettre et un chiffre et peut contenir des caractères spéciaux

J'ai besoin d'une expression régulière avec condition:

  • min 6 caractères, max 50 caractères
  • doit contenir 1 lettre
  • doit contenir 1 chiffre
  • peut contenir des caractères spéciaux comme! @ # $% ^ & * () _ +

Actuellement, j'ai un modèle: (?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{6,50})$

Cependant, il n'autorise pas les caractères spéciaux, quelqu'un a-t-il une bonne expression rationnelle pour cela?

Merci

24
Budiawan

Peut-être qu'une seule expression régulière pourrait être utilisée, mais cela rend difficile de donner à l'utilisateur des commentaires sur la règle qu'il ne suit pas. Une approche plus traditionnelle comme celle-ci vous donne des commentaires que vous pouvez utiliser dans l'interface utilisateur pour indiquer à l'utilisateur quelle règle pwd n'est pas respectée:

function checkPwd(str) {
    if (str.length < 6) {
        return("too_short");
    } else if (str.length > 50) {
        return("too_long");
    } else if (str.search(/\d/) == -1) {
        return("no_num");
    } else if (str.search(/[a-zA-Z]/) == -1) {
        return("no_letter");
    } else if (str.search(/[^a-zA-Z0-9\!\@\#\$\%\^\&\*\(\)\_\+]/) != -1) {
        return("bad_char");
    }
    return("ok");
}
61
jfriend00

suite à la réponse jfriend00 j'ai écrit ce violon pour tester sa solution avec quelques petits changements pour la rendre plus visuelle:

http://jsfiddle.net/9RB49/1/

et voici le code:

checkPwd = function() {
    var str = document.getElementById('pass').value;
    if (str.length < 6) {
        alert("too_short");
        return("too_short");
    } else if (str.length > 50) {
        alert("too_long");
        return("too_long");
    } else if (str.search(/\d/) == -1) {
        alert("no_num");
        return("no_num");
    } else if (str.search(/[a-zA-Z]/) == -1) {
        alert("no_letter");
        return("no_letter");
    } else if (str.search(/[^a-zA-Z0-9\!\@\#\$\%\^\&\*\(\)\_\+\.\,\;\:]/) != -1) {
        alert("bad_char");
        return("bad_char");
    }
    alert("oukey!!");
    return("ok");
}

btw, son fonctionnement comme un charme! ;)

meilleures salutations et merci à jfriend00 bien sûr!

16
Hugo

Une expression rationnelle plus élégante et autonome pour répondre à ces exigences de mot de passe (courantes) est:

^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d^a-zA-Z0-9].{5,50}$

La touche élégante ici est que vous n'avez pas à coder en dur les symboles comme $ @ # etc. Pour accepter tous les symboles, vous dites simplement: "acceptez aussi tous les caractères non alphanumériques et non les chiffres". La dernière partie de l'expression régulière {5,50} peut être facilement modifié et correspond au nombre minimum et maximum de caractères: dans cet exemple spécifique jusqu'à 5 caractères, l'expression régulière renvoie une non correspondance (c'est-à-dire que 6 caractères minimum sont requis pour valider). De même, après 50 caractères, il renvoie également une non-correspondance.

2
Albz

J'ai une expression régulière, mais c'est un peu délicat.

^(?:(?<Numbers>[0-9]{1})|(?<Alpha>[a-zA-Z]{1})|(?<Special>[^a-zA-Z0-9]{1})){6,50}$

Laissez-moi vous expliquer et comment vérifier si le mot de passe testé est correct:

Il y a trois groupes nommés dans l'expression régulière. 1) "Numbers": correspondra à un seul numéro dans la chaîne. 2) "Alpha": correspondra à un seul caractère de "a" à "z" ou "A" à "Z" 3) "Spécial": correspondra à un seul caractère qui n'est pas "Alpha" ou "Numbers"

Ces trois groupes nommés sont regroupés dans un autre groupe et {6,50} conseille à la machine regex de capturer au moins 6 des groupes mentionnés ci-dessus, mais pas plus de 50.

Pour vous assurer qu'un mot de passe correct est entré, vous devez vérifier s'il existe une correspondance, et après cela, si les groupes correspondants sont capturés autant que vous le souhaitez. Je suis développeur C # et je ne sais pas comment cela fonctionne en javascript, mais en C # vous devrez vérifier:

match.Groups["Numbers"].Captures.Count > 1

Espérons que cela fonctionne de la même manière en javascript! Bonne chance!

1
Fischermaen

J'utilise ceci

export const validatePassword = password => {
  const re = /^(?=.*[A-Za-z])(?=.*\d)[a-zA-Z0-9!@#$%^&*()~¥=_+}{":;'?/>.<,`\-\|\[\]]{6,50}$/
  return re.test(password)
}
0
chii