J'essaie de créer un test Regex en JavaScript qui testera une chaîne pour contenir l'un de ces caractères:
!$%^&*()_+|~-=`{}[]:";'<>?,./
Plus d'informations si vous êtes intéressé :)
C'est pour une application de changement de mot de passe assez cool sur laquelle je travaille. Au cas où vous seriez intéressé, voici le reste du code.
J'ai un tableau qui répertorie les exigences en matière de mot de passe et lorsque les utilisateurs finaux tapent le nouveau mot de passe, il testera un tableau d'expressions régulières et placera une coche dans la ligne de tableau correspondante si cela ... vérifie :) Je dois juste ajouter celui-ci à la place du 4ème élément du validation
tableau.
var validate = function(password){
valid = true;
var validation = [
RegExp(/[a-z]/).test(password), RegExp(/[A-Z]/).test(password), RegExp(/\d/).test(password),
RegExp(/\W|_/).test(password), !RegExp(/\s/).test(password), !RegExp("12345678").test(password),
!RegExp($('#txtUsername').val()).test(password), !RegExp("cisco").test(password),
!RegExp(/([a-z]|[0-9])\1\1\1/).test(password), (password.length > 7)
]
$.each(validation, function(i){
if(this)
$('.form table tr').eq(i+1).attr('class', 'check');
else{
$('.form table tr').eq(i+1).attr('class', '');
valid = false
}
});
return(valid);
}
Oui, il existe également une validation côté serveur correspondante!
javascript
jquery
regex
pixelbobby
la source
la source
.addClass("check")
et.removeClass("check")
? Et voirif (someBoolean == true)
dans le code me fait toujours grincer des dents. Fais justeif (someBoolean)
. Ou, mieux encore, faites simplement$(".form table tr").eq(i+1).toggleClass("check", !!this); valid = valid && !!this;
.Réponses:
L'expression régulière pour cela est vraiment simple. Utilisez simplement une classe de caractères. Le trait d'union est un caractère spécial dans les classes de caractères, il doit donc être le premier:
Vous devez également échapper aux autres métacaractères d'expression régulière.
Edit: Le trait d'union est spécial car il peut être utilisé pour représenter une plage de caractères. Cette même classe de caractères peut être simplifiée avec des plages à ceci:
Il existe trois gammes. '$' à '/', ':' à '?' et '{' à '~'. la dernière chaîne de caractères ne peut pas être représentée plus simplement avec une plage:! "^ _` [].
Utilisez une table ACSII pour rechercher des plages de classes de caractères.
la source
\Q
et\E
ne fonctionne pas dans le moteur JS RegExp :(/^\Q.\E$/.test('Q+E'); // true
Le moyen le plus simple et le plus court pour y parvenir:
Explication
[^...]
Correspond à un seul caractère non présent dans la liste ci-dessous\p{L}
=> correspond à tout type de lettre de n'importe quelle langue\d
=> correspond à un chiffre de zéro à neuf\s
=> correspond à tout type de caractère invisible@#
=>@
et#
caractèresN'oubliez pas de passer le
u
drapeau (unicode).la source
^
est nécessaire lorsque nous utilisons\w
et\s
en minuscules.w
extérieurs
, soit à l' extérieur , et puisque ces deux ne se croisent pas vraiment, cela laisse juste passer tous les personnages? (Ne filtrant donc rien.)/[\W\S]/
) laisse tout passer. Une représentation plus précise de ce à quoi je pense qu'Amir voulait en venir[^\w\s]
. Dans le premier cas, l'expression régulière dit «correspond à tout ce qui n'est pas alphanumérique OU qui n'est pas un espace», ce qui, comme vous l'avez mentionné, permet de tout passer puisque les caractères alphanumériques ne sont pas des espaces et vice versa. Ce dernier dit "correspond à tout ce qui n'est pas alphanumérique ET qui n'est pas un espace". Bien sûr, des exceptions s'appliquent dans la mesure où les caractères accentués (commeÀ
) sont mis en correspondance[^\w\s]
.Répondre
Explication
Cela crée une classe de caractères en supprimant les caractères de mot, les caractères d'espacement et en rajoutant le caractère de soulignement (car le trait de soulignement est un caractère "mot"). Il ne reste que les caractères spéciaux. Les lettres majuscules représentent la négation de leurs équivalents minuscules.
\W
sélectionnera tous les caractères non "mot" équivalents à[^a-zA-Z0-9_]
\S
"sélectionnera tous les caractères non" espaces "équivalents à[ \t\n\r\f\v]
_
" _ "car nous l'annulons lors de l'utilisation de\W
et nous devons le rajouter dansla source
la source
RegExp
constructeur lorsque vous pouvez simplement utiliser un littéral regex. Beaucoup moins de travail qui s'échappe (dont la plupart sont de toute façon inutiles), et c'est aussi plus efficace.Un moyen simple d'y parvenir est l'ensemble négatif [^ \ w \ s]. Cela attrape essentiellement:
Pour une raison quelconque, [\ W \ S] ne fonctionne pas de la même manière, il n'effectue aucun filtrage. Un commentaire de Zael sur l'une des réponses fournit une explication.
la source
/[^\w\s]/.test('é') # true
,/[^\w\s]/.test('_') # false
.Remplacez tous les derniers de n'importe quelle langue dans 'A', et si vous souhaitez par exemple tous les chiffres à 0:
la source