J'ai une regex
/^([a-zA-Z0-9]+)$/
cela ne permet que les caractères alphanumériques, mais également si je n’insère que des chiffres ou des caractères, il l’accepte également. Je veux que cela fonctionne comme le champ ne devrait accepter que des valeurs alphanumériques mais la valeur doit contenir au moins 1 caractère et 1 chiffre.
Pourquoi ne pas d'abord appliquer l'ensemble du test, puis ajouter des tests individuels pour les caractères et les nombres? Quoi qu’il en soit, si vous voulez tout faire en une expression rationnelle, utilisez un aspect positif avant-regard:
/^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$/
Cette RE fera:
/^(?:[0-9]+[a-z]|[a-z]+[0-9])[a-z0-9]*$/i
Explication de RE:
(?:...)
crée un groupe non référencé/i
est le ignore-case flag, donc a-z
== a-zA-Z
.Je peux voir que d'autres intervenants vous ont fourni une solution complète. Le problème avec les expressions rationnelles est qu’elles peuvent être difficiles à maintenir/à comprendre.
Une solution plus simple consisterait à conserver votre expression rationnelle existante, puis à créer deux nouvelles expressions rationnelles pour tester votre "au moins un alphabétique" et "au moins un numérique".
Alors, testez ceci: -
/^([a-zA-Z0-9]+)$/
Ensuite ceci :-
/\d/
Ensuite ceci :-
/[A-Z]/i
Si votre chaîne passe les trois regex, vous avez la réponse dont vous avez besoin.
Bien que la réponse acceptée soit correcte, je trouve cette expression régulière beaucoup plus facile à lire:
REGEX = "([A-Za-z]+[0-9]|[0-9]+[A-Za-z])[A-Za-z0-9]*"
Cette solution accepte au moins 1 chiffre et au moins 1 caractère:
[^\w\d]*(([0-9]+.*[A-Za-z]+.*)|[A-Za-z]+.*([0-9]+.*))
Et une idée avec un chèque négatif.
/^(?!\d*$|[a-z]*$)[a-z\d]+$/i
^(?!
au début regarder devant si la chaîne ne fait pas\d*$
contient uniquement des chiffres |
ou[a-z]*$
ne contient que des lettres[a-z\d]+$
correspond à une ou plusieurs lettres ou chiffres jusqu'à la fin de $
.Regardez cette démo de regex101
(le drapeau i
active la correspondance sans casier : a-z
correspond a-zA-Z
)