Patrón Regex para que coincida con al menos 1 número y 1 carácter en una cadena

Tengo una expresión regular

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

esto solo permite caracteres alfanuméricos, pero también si solo inserto número (s) o solo carácter (s), entonces también lo acepta. Quiero que funcione como si el campo solo aceptara valores alfanuméricos, pero el valor debe contener al menos 1 carácter y 1 número.

¿Por qué no aplicar primero la prueba completa y luego agregar pruebas individuales para los personajes y números? De todos modos, si quieres hacerlo todo en una expresión regular, usa un lookahead positivo:

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

Este RE hará:

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

Explicación de RE:

  • Haga coincidir cualquiera de los siguientes:
    1. Al menos un número, luego una letra o
    2. Al menos una letra, luego un número más
  • Cualquier número y letras restantes
  • (?:...) crea un grupo sin referencia
  • /i es la bandera de ignorar caso , de modo que az == a-zA-Z .

Puedo ver que otros respondedores te han dado una solución completa. El problema con las expresiones regulares es que pueden ser difíciles de mantener / comprender.

Una solución más fácil sería retener su expresión regular existente, luego crear dos nuevas expresiones regulares para probar su “al menos un alfabético” y “al menos un número”.

Entonces, prueba para esto:

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

Luego esto :-

 /\d/ 

Luego esto :-

 /[AZ]/i 

Si su cadena pasa las tres expresiones regulares, tiene la respuesta que necesita.

Si bien la respuesta aceptada es correcta, creo que esta expresión regular es mucho más fácil de leer:

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

Tal vez un poco tarde, pero esta es mi RE:

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

Explicación:

\w* -> 0 o más dígitos alfanuméricos, al principio

\d+[a-zA-Z]|[a-zA-Z]+\d -> un dígito + una letra O una letra + un dígito

\w* -> 0 o más dígitos alfanuméricos, de nuevo

Espero que sea comprensible

Esta solución acepta al menos 1 número y al menos 1 carácter:

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

Y una idea con un control negativo.

 /^(?!\d*$|[az]*$)[az\d]+$/i 
  • ^(?! al inicio mira hacia adelante si la cadena no lo hace
  • \d*$ contiene solo dígitos | o
  • [az]*$ contiene solo letras
  • [az\d]+$ coincide con una o más letras o dígitos hasta $ end.

Eche un vistazo a esta demo de regex101

(la bandera i enciende la coincidencia sin caja : az coincide con a-zA-Z )