Tengo la siguiente expresión regular que comprueba una política de contraseña. Está validado para funcionar:
(^([zZ]d{3})*$)|((?=.{9,})(?=.*?[^ws])(?=.*?[0-9])(?=.*?[A-Z]).*?[a-z].*)
Quiero usar la expresión regular en un script bash para validar un psssword de la siguiente manera:
echo $password | grep "(^([zZ]d{3})*$)|((?=.{9,})(?=.*?[^ws])(?=.*?[0-9])(?=.*?[A-Z]).*?[a-z].*)"
if [[ $? -eq 0 ]] ; then
Esto no funciona en bash. Mi pregunta es :
¿Cómo convierto este regex "puro" a uno quetrabajar en bash? ¿Qué caracteres necesito para escapar? ¿Cuál es la forma correcta de pasar la expresión regular a grep? ¿Hay alguna otra cosa que deba tener en cuenta?
Gracias
Respuestas
2 para la respuesta № 1Esto puede ser difícil.
Estándar grep
tiene capacidades limitadas. Solo admite expresiones regulares extendidas POSIX que no reconocen la afirmaciones de búsqueda anticipada su expresión regular se basa en.
Si tienes gnu grep
En tu máquina, puedes pasarla -P
o --perl-regexp
parámetro, lo que le permite utilizar expresiones regulares compatibles con Perl. Entonces tu expresión regular debería funcionar.
Como se mencionó en mi comentario, la expresión regular tal como está no es adecuada para la validación de contraseñas. Permite contraseñas como z000
o incluso la cadena vacía:
( # Either match and capture...
^ # Start of the string
( # Match (and capture, uselessly in this case)
[zZ] # case-insensitive z
d{3} # three digits
)* # zero(!) or more times
$ # until the end of the string
) # End of first group.
| # OR
( # match and capture...
(?=.{9,}) # a string that"s at least 9 characters long,
(?=.*?[^ws]) # contains at least one non-alnum, non-space character,
(?=.*?[0-9]) # at least one ASCII digit
(?=.*?[A-Z]) # at least one ASCII uppercase letter
.*?[a-z].* # and at least one ASCII lowercase letter
) # no anchor to start/end of string...
Mejor uso
^(?=.{9})(?=.*?[^ws])(?=.*?[0-9])(?=.*?[A-Z]).*?[a-z].*$