2010-08-27 16 views
5

Similar a this topic.C# Regex para un nombre de usuario con algunas restricciones

estoy tratando de validar un nombre de usuario con las siguientes restricciones:

  • debe comenzar con una letra o un número
  • debe ser de 3 a 15 caracteres de longitud
  • Los símbolos incluyen: . - _() []
  • Los símbolos pueden no ser adyacentes, pero las letras y los números pueden

Editar:

  • Letras y números son az AZ 0-9

Has perplejo por un tiempo. Soy nuevo en Regex.

+0

Cuando dice "los símbolos no pueden aparecer consecutivamente", ¿quiere decir '.-_() []', O quiere decir 'A-Za-z0-9' no pueden repetir, también? –

+1

¿Qué harán las personas sin sus palos dobles de hockey? ('] [') –

+2

Cuando dices "letra" o "número" ¿te refieres a a-z y 0-9, o deberían permitirse las letras y números extranjeros? Por ejemplo, una persona china consideraría esto como un número válido: 九 –

Respuesta

11

No es tan limpio para expresar un conjunto de reglas relacionadas en una sola expresión regular, pero se puede hacer mediante el uso de afirmaciones Lookaround (Rubular):

@"^(?=[A-Za-z0-9])(?!.*[._()\[\]-]{2})[A-Za-z0-9._()\[\]-]{3,15}$" 

Explicación:

 
(?=[A-Za-z0-9])   Must start with a letter or number 
(?!.*[._()\[\]-]{2})  Cannot contain two consecutive symbols 
[A-Za-z0-9._()\[\]-]{3,15} Must consist of between 3 to 15 allowed characters 

Usted Es posible que desee considerar si esto sería más fácil de leer y más fácil de mantener como una lista de expresiones regulares más simples, todas las cuales deben validar con éxito, o bien escríbalas en el código C# común.

+0

El uso de una expresión regular para una verificación de longitud es ineficiente, poco claro y está sujeto a roturas. (Creo que el código de Mark está roto, ya que parece que requiere una letra o número seguido de 3-15 MÁS caracteres, por lo que en realidad coincide con 4-16 caracteres.) Usar una prueba separada para cada requisito será mucho más fácil de entender y mantener. –

+0

Gracias por la pronta respuesta. Esto también funcionó, pero falta el período de la parte (?!. * [_() \ [\] - \ {2}). debe ser (?!. * [._() \ [\] -] {2}) de lo contrario, un período puede seguir cualquier símbolo – Marlon

+2

@Ben: no está claro, sí, pero el código de Mark utiliza la aserción de ancho cero (consume sin caracteres), por lo que se conserva la restricción de longitud. –

14

como una optimización de la respuesta de la marca:

^(?=.{3,15}$)([A-Za-z0-9][._()\[\]-]?)*$ 

Explicación:

(?=.{3,15}$)     Must be 3-15 characters in the string 
([A-Za-z0-9][._()\[\]-]?)* The string is a sequence of alphanumerics, 
           each of which may be followed by a symbol 

Ésta permite caracteres alfanuméricos Unicode:

^(?=.{3,15}$)((\p{L}|\p{N})[._()\[\]-]?)*$ 

Ésta es la variante de Unicode, además de los usos no -capturar grupos:

^(?=.{3,15}$)(?:(?:\p{L}|\p{N})[._()\[\]-]?)*$ 
+0

1 que es una variación bastante útil porque evita la repetición de las definiciones de "letra o número" y "símbolo". No necesitas los paréntesis más internos. –

+0

Tienes razón, ese era un átomo entre paréntesis. Redundantes parens eliminado. –

+0

También debería ser más rápido, ya que solo hay un vistazo anticipado, y es mucho más simple. –

Cuestiones relacionadas