2011-04-09 10 views
5

En general: ¿cómo puedo asociar una palabra con las reglas de expresiones regulares para a) el comienzo, b) la palabra completa, yc) el final?.NET regex matching

Más concretamente: ¿Cómo coinciden con una expresión de longitud> = 1 que tiene las siguientes reglas:

  1. No puede tener cualquiera de:! @ #
  2. No puede empezar con un espacio o =
  3. No puede terminar con un espacio

Traté:

^[^\s=][^[email protected]#]*[^\s]$ 

Pero los ^[^\s=] se mueve a juego pasado el primer carácter de la palabra . Por lo tanto, esto también coincide con palabras que comienzan con '!' o '@' o '#' (por ejemplo: '#ab' o '@aa'). Esto también fuerza a la palabra a tener al menos 2 caracteres (un carácter inicial que no es espacio o = - y un carácter no espacial al final).

llegué a:

^[^\s=([email protected]#)]\1*$ 

para una expresión regular coincidir las dos primeras reglas. Pero, ¿cómo no relaciono espacios finales en la palabra con palabras de longitud 1?

+2

+1 Por tener la primera pregunta de expresiones regulares que he visto en semanas que incluye intentos fallidos anteriores. En otras palabras, +1 por ser una pregunta de * real * regex. –

Respuesta

3

Su primer intento fue muy cercano. Sólo es necesario excluir más caracteres para la primera y última partes, y hacer que las dos últimas partes opcionales:

^[^\[email protected]#](?:[^[email protected]#]*[^\[email protected]#])?$ 

Esto asegura que las tres secciones no incluirán ninguna de [email protected]#. Luego, si la palabra tiene más de un carácter, deberá terminar con un espacio no, con solo caracteres seleccionados que llenen el espacio intermedio. Todo esto se aplica correctamente debido a los anclajes ^ y $.

No estoy muy seguro de qué coincide con el segundo ejemplo, ya que el () se debe tomar como caracteres literales cuando se incrusta en una clase de caracteres, no como un grupo de captura.

4

La solución de Cameron es precisa y eficiente (y debe utilizarse para cualquier código de producción donde la velocidad necesite optimizarse). La respuesta que se presenta aquí es menos eficiente, pero demuestra un enfoque general para aplicar la lógica utilizando expresiones regulares.

Puede usar múltiples afirmaciones de expresiones retrospectivas positivas y negativas (todas aplicadas en una ubicación en la cadena de destino, generalmente el comienzo), para aplicar múltiples restricciones lógicas para una coincidencia. La siguiente expresión gráfica comentada demuestra lo fácil que es hacer esto en este caso de ejemplo. Necesitas entender cómo el motor de expresiones regulares realmente coincide (y no concuerda), para llegar a las expresiones correctas, pero no es difícil una vez que lo dominas.

foundMatch = Regex.IsMatch(subjectString, @" 
    # Match 'word' meeting multiple logical constraints. 
    ^   # Anchor to start of string. 
    (?=[^[email protected]#]*$) # It cannot have any of: ! @ #,  AND 
    (?![ =])  # It cannot begin with a space or =, AND 
    (?!.*\S$)  # It cannot end with a space,  AND 
    .{1,}   # length >= 1 (ok to match special 'word') 
    \z   # Anchor to end of string. 
    ", 
    RegexOptions.IgnorePatternWhitespace); 

Esta aplicación de la "expresión regular-lógica" se utiliza frecuentemente para la validación de contraseña compleja.

Cuestiones relacionadas