2010-01-24 9 views
8

que desea validar los nombres de usuario de acuerdo con este esquema:expresión regular que expresa "al menos uno no sea un dígito"

  1. Caracteres permitidos: letras, números, guión, guión bajo
  2. El primer carácter debe ser una letra o un número
  3. El nombre de usuario no puede ser todos los números

Este regulares satisface expresión 1 y 2 anteriores, pero no puede averiguar cómo satisfacer 3:

/^[a-zA-Z\d][\w\-]+$/ 

(estoy usando Ruby, si es relevante)

Respuesta

10

No es muy eficiente, pero simple:

/^(?!\d+$)[a-zA-Z\d][\w\-]+$/

La búsqueda hacia delante simplemente significa: "lo que sigue no es una cadena de números que continúan hasta el final ".

+0

ordenada truco, ¿está disponible en las implementaciones de expresiones regulares no rubí? –

+0

+1 Agradable. Por lo general, evito mirar hacia adelante porque no los capto muy bien, pero esta es una buena ilustración de cómo usarlos. –

+0

@Mark: No en todos, pero en la mayoría. Python, PHP, Perl y Javascript son los que sé que lo soportan. –

1

No es ideal, pero fácil: Utilice una segunda pasada con la expresión regular /^.*[a-zA-Z_\-].*$/

Sólo asegúrese de que pasa a ambos y se le multa.

+2

'/ \ D /' funcionaría igual de bien si ejecuta un segundo filtro. No es necesario que coincida de principio a fin. –

+0

El segundo pase puede ser '[-a-z_]' (supongo que estás haciendo una coincidencia insensible a mayúsculas y minúsculas; si no es así, entonces '[-A-Za-z_]', por supuesto. No tienes que preocuparte sobre el principio, el final o cualquier otra cosa: si pasa el primero, solo asegúrese de que haya una letra, guión bajo o guión en cualquier lugar. – Jay

+0

Gracias, no estaba seguro acerca de Ruby, pero Java solo informa una coincidencia si toda la cadena coincide con. Supongo que \ D no es un dígito? –

1

Si usted puede ir con dos pasadas, una expresión regular pase más sencillo y rápido segundo es:

/[^\d]/ 

Esto sólo coincide con nada que no sea un número y tiene que coincidir sólo uno y termina antes de tiempo. No es necesario que sea estricto aquí porque el primer pase ya rechaza los caracteres no permitidos.

0

me gustaría utilizar la expresión regular que es necesario para la validación y luego algo como:

passwd.to_i.to_s.length != passwd.length 

para verificar que passwd no es una cadena de dígitos después de que pase la validación primaria.

0

Sin embargo, otra manera, aunque puede no funcionar tan bien como Max:

/^[a-z0-9][-\w]*[-_a-z][-\w]*$/i 
Cuestiones relacionadas