2010-01-04 11 views
7

Estoy buscando una expresión regular bastante específica y casi la tengo pero no del todo.Regex para contraseña que requiere un carácter numérico o no alfanumérico

Quiero una expresión regular que se requieren al menos 5 charactors, donde al menos uno de esos personajes es ya sea un valor numérico o un carácter no alfanumérico.

Esto es lo que tengo hasta ahora:

^(?=.*[\d]|[[email protected]#$%\^*()_\-+=\[{\]};:|\./])(?=.*[a-z]).{5,20}$ 

Así que el problema es la "o" parte. Permitirá valores no alfanuméricos, pero aún requiere al menos un valor numérico. Puedes ver que tengo el operador o "|" entre mis numéricos requeridos y los no alfanuméricos, pero eso no parece funcionar.

Cualquier sugerencia sería genial.

+0

de un carácter no alfanumérico puede usar \ W (personaje no palabra, es decir, ninguno de [a-zA-Z0-9_ ]) en lugar de [! @ # $% \^*() _ \ - + = \ [{\]} ;: | \ ./] –

Respuesta

19

Probar:

^(?=.*(\d|\W)).{5,20}$ 

Una breve explicación:

^       # match the beginning of the input 
(?=      # start positive look ahead 
    .*      # match any character except line breaks and repeat it zero or more times 
    (      # start capture group 1 
    \d     #  match a digit: [0-9] 
    |      #  OR 
    \W     #  match a non-word character: [^\w] 
)      # end capture group 1 
)       # end positive look ahead 
.{5,20}     # match any character except line breaks and repeat it between 5 and 20 times 
$       # match the end of the input 
+0

miedo no ... eso no requiere que tenga un número o un carácter no alfanumérico –

+0

Sí lo hace. ¿Supongo que no lo has probado correctamente?La mirada hacia adelante requiere que la cadena contenga al menos un dígito o sin palabra. –

+2

... y si quería decir * "un número ** y ** carácter no alfanumérico" * en su lugar, entonces esto hará el truco: '^ (? =. * \ D) (? =. * \ W) . {5,20} $ ' –

0

¿Qué le parece esto?

^.*?[\[email protected]#$%\^*()_\-+=\[{\]};:|\./].*$ 

Para la longitud 5,20 favor utilice las herramientas normales función strlen

+0

Eso no funciona, como si quisiera un archivo no alfanumérico o carácter numérico al inicio o al final, fallará. Sin embargo, me pusiste en el camino correcto. –

+0

¿Realmente has probado? Debería funcionar para caracteres no alfanuméricos o numéricos al principio o al final también. – YOU

0

¿Es realmente necesario para rellenar todo en una expresión regular gigante? Solo use la lógica del programa (5 ≤ length(s) ≤ 20) ∧ (/[[:digit:]]/ ∨ /[^[:alpha:]]/). Mucho más fácil de leer sintáctica y semánticamente, creo.

+0

Estoy usando membresía de ASP.NET en todas partes, tendría que volver e implementar esa lógica en múltiples lugares junto con excepciones, etc. Es más fácil usar Regex en la configuración de Membresía. Regex tiene su lugar al igual que todas las demás técnicas de programación. –

1

Tal vez esto puede funcionar para usted:

^.*[\d\W]+.*$ 

Y el uso de un código como este para comprobar tamaño de la cadena:

if(str.len >= 5 && str.len =< 20 && regex.ismatch(str, "^.*[\d\W]+.*$")) { ... } 
+0

Lo necesito todo en una expresión regular para mi problema actual. –

0

solución Bastante simple, una vez S.Mark me consiguió en el camino correcto , solo necesitaba fusionar mis piezas numéricas y no alfanuméricas como una sola.

Ésta es la expresión regular final para cualquier persona que esté interesada:

^(?=.*[\[email protected]#$%\^*()_\-+=\[{\]};:|\./])(?=.*[a-z]).{5,20}$ 

Esto permitirá que cualquier contraseña entre 5 y 20 caracteres y requiere al menos una letra y un numérico y/o un carácter no alfanumérico.

Cuestiones relacionadas