Estoy intentando escribir una validación de nombre de usuario que tiene las siguientes restricciones:expresión regular para validar los nombres de usuario con al menos una letra y sin caracteres especiales
- debe contener al menos 1 letra (a-ZA- Z)
- puede no contener nada más que cifras, letras o caracteres de subrayado
Los siguientes ejemplos son válidos: abc123, mi_nombre, 12345A
Los siguientes ejemplos no son válidos: 123456, mi_nombre !, _1235
Encontré algo sobre el uso de lookaheads positivos para el uso de la carta: (? =. * [a-zA-Z]), y parece que podría haber algún tipo de error Mirar hacia adelante para la segunda restricción, pero no estoy seguro de cómo mezclarlos en una expresión regular. (Nota ... No tengo muy claro qué hace la porción. * Dentro de la búsqueda anticipada ...)
¿Es algo como esto:/(? =. * [A-zA-Z]) (? !. * [^ a-zA-Z0-9 _])/
Editar:
Debido a que la pregunta se refiere a una expresión regular, la respuesta es que estoy aceptando:
/^[a-zA-Z0-9_]*[a-zA-Z][a-zA-Z0-9_]*$/
Sin embargo, lo que realmente voy a implementar es la sugerencia de Bryan Oakley de dividirlo en múltiples cheques más pequeños. Esto facilita la lectura y la ampliación en el futuro en caso de que cambien los requisitos. ¡Gracias a todos!
Y porque tagged esto con ruby-on-rails, voy a incluir el código realidad estoy usando:
validate :username_format
def username_format
has_one_letter = username =~ /[a-zA-Z]/
all_valid_characters = username =~ /^[a-zA-Z0-9_]+$/
errors.add(:username, "must have at least one letter and contain only letters, digits, or underscores") unless (has_one_letter and all_valid_characters)
end
Sweet, falta un _ en la primera prueba para 0 o más válidos, pero aparte de eso, ¡funciona! – Paul