2011-10-07 53 views

Respuesta

62

¿Por qué no aplicar primero toda la prueba y luego agregar pruebas individuales para los caracteres y números? De todos modos, si quiere hacerlo todo en una expresión regular, utilizar búsqueda positiva hacia delante:

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

Esto es mejor que la solución siguiente: si desea agregar un guión y una marca de subrayado, esto seguirá funcionando. Ej: '^ (? =. * [0-9]) (? =. * [Az]) ([a-z0-9 _-] +) $' abc-d12345 – Sababado

+1

muchas gracias por la respuesta y la explicación de forma de pensar – merveotesi

+0

@Sababado gracias por _ - solución :-) – Rahi

16

Esta RE hará:

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

Explicación de RE:

  • Partido cualquiera de los siguientes:
    1. al menos un número, a continuación, una letra o
    2. Al menos una letra, luego un número más
  • Los números y las letras restantes

  • (?:...) crea un grupo sin referencias
  • /i es el ignore-case bandera, de manera que a-z == a-zA-Z.
+0

¿Por qué necesitamos la sensibilidad en este caso? –

+0

El/i al final lo hace insensible a mayúsculas y minúsculas. – Kasaku

+0

En su código, mencionó 'a-zA-Z'. Ayer hice una prueba y deduje que '/ [a-z]/i' es ligeramente más rápido que'/[a-zA-Z]/'. Ver: http://jsperf.com/regexp-a-z-i-vs-a-za-z –

13

puedo ver que otro personal de respuesta que 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".

Por lo tanto, la prueba para esto: -

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

Entonces esto: -

/\d/ 

Entonces esto: -

/[A-Z]/i 

Si la cadena pasa por las tres expresiones regulares, usted tiene la respuesta que necesitas

+0

Me gusta mucho la simplicidad de esto. Mucho, mucho más fácil de leer y mantener. –

2

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 inicio

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

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

espero que era comprensible

3

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

Mientras que la respuesta aceptada es correcta, creo que este regex mucho más fácil de leer:

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