Regex pour alphanumérique avec au moins 1 nombre et 1 caractère

J'ai une regex

/ ^ ([A-zA-Z0-9] +) $ /

Cela ne permet que les alphanumériques, mais aussi si j'insère seulement un ou plusieurs numéros, mais aussi l'accepte. Je veux qu'il fonctionne comme si le champ n'acceptait que des valeurs alphanumériques, mais la valeur doit contenir au moins 1 caractère et 1 nombre.

Pourquoi ne pas appliquer tout le test complet, puis ajouter des tests individuels pour les caractères et les chiffres? Quoi qu'il en soit, si vous voulez le faire tout en un regexp, utilisez un lookahead positif:

/^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$/ 

Ce RE fera:

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

Explication de RE:

  • Faites correspondre l'une des conditions suivantes:
    1. Au moins un numéro, puis une lettre ou
    2. Au moins une lettre, puis un nombre plus
  • Tous les nombres et lettres restants
  • (?:...) crée un groupe non référencé
  • /i est l'indicateur de cas ignoré , de sorte que az == a-zA-Z .

Je peux voir que les autres intervenants vous ont donné une solution complète. Le problème avec les règles est qu'elles peuvent être difficiles à comprendre.

Une solution plus facile serait de conserver votre regex existant, puis de créer deux nouveaux regexes pour tester votre "au moins un alphabétique" et "au moins un numéro".

Donc, testez ceci: –

 /^([a-zA-Z0-9]+)$/ 

Ensuite ceci :-

 /\d/ 

Ensuite ceci :-

 /[AZ]/i 

Si votre chaîne passe les trois réggex, vous avez la réponse dont vous avez besoin.

J'ai résolu:

Au moins 1 nombre et au moins 1 caractère

 [^\w\d]*(([0-9]+.*[A-Za-z]+.*)|[A-Za-z]+.*([0-9]+.*)) 

Peut-être un peu en retard, mais c'est mon RE:

/^(\w*(\d+[a-zA-Z]|[a-zA-Z]+\d)\w*)+$/

Explication:

\w* -> 0 ou plus de chiffres alphanumériques, au début

\d+[a-zA-Z]|[a-zA-Z]+\d -> un chiffre + une lettre OU une lettre + un chiffre

\w* -> 0 ou plus de chiffres alphanumériques, à nouveau

J'espère que c'est compréhensible

Alors que les réponses fournies sont correctes, je trouve que cette regex est beaucoup plus facile à lire:

 REGEX = "([A-Za-z]+[0-9]|[0-9]+[A-Za-z])[A-Za-z0-9]*" 

Et une idée avec un contrôle négatif.

 /^(?!\d*$|[az]*$)[az\d]+$/i 
  • ^(?! commencez à regarder si la chaîne ne fonctionne pas
  • \d*$ ne contient que des chiffres | ou
  • [az]*$ ne contiennent que des lettres
  • [az\d]+$ correspond à une ou plusieurs lettres ou chiffres jusqu'à $ fin.

Jetez un oeil à cette démo regex101

(Le drapeau i déclenche une correspondance sans correspondance : az correspond a-zA-Z )