web-dev-qa-db-fra.com

Motif de regex pour correspondre à au moins 1 chiffre et 1 caractère dans une chaîne

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.

39
OM The Eternity

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]+)$/
78
phihag

Cette RE fera:

/^(?:[0-9]+[a-z]|[a-z]+[0-9])[a-z0-9]*$/i

Explication de RE:

  • Correspondre à l'un des éléments suivants:
    1. Au moins un chiffre, puis une lettre ou
    2. Au moins une lettre, puis un chiffre plus
  • Tous les chiffres et lettres restants

  • (?:...) crée un groupe non référencé
  • /i est le ignore-case flag, donc a-z == a-zA-Z.
17
Rob W

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.

14
Paul Alan Taylor

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]*"
5
Lonely Neuron

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]+.*))
4
user2043372

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)

2
bobble bubble