2011-05-27 20 views
6

Actualmente estoy buscando un proyecto que utiliza altamente expresiones regulares. Las cadenas de entrada ya están en mayúsculas y, por lo tanto, se ha establecido el indicador de IgnorarCase de expresión regular. El motor MS RegEx interno sin embargo está cambiando todo el caso de nuevo a inferior, que es un golpe innecesario. Cambiar el patrón de expresiones de reg a mayúsculas y quitar la bandera ayuda al rendimiento.¿Cómo mayúsculas un patrón de expresiones regulares?

¿Alguien sabe de una biblioteca de algoritmo que puede en mayúsculas los patrones Reg ex sin afectar los nombres de grupo o caracteres escapados?

+0

u can use '[^ AZ]' – diEcho

+0

'ToUpper()' en la cadena de su patrón. Esto no debería afectar los caracteres especiales. – RBaarda

+2

Me temo que puede, por ejemplo, \ w o \ s tiene un significado bastante diferente cuando ToUpper() - ed – petho

Respuesta

1

Se podía ir y buscar letras minúsculas que no están precedidos por un número impar de barras invertidas:

(?<!(?<!\\)(?:\\\\)*\\)\p{Ll}+ 

A continuación, pasar el partido a un MatchEvaluator, mayúsculas y reemplazar el texto en la cadena original. No sé C#, por lo que este podría no funcionar de inmediato (fragmento de código toma y se modificó un poco de RegexBuddy), pero es un comienzo:

string resultString = null; 
resultString = Regex.Replace(subjectString, 
    @"(?<!     # Negative lookbehind: 
     (?<!\\)(?:\\\\)*\\ # Is there no odd number of backslashes 
     |     # nor 
     \(\?<?\p{L}*  # (?<tags or (?modifiers 
    )     # before the current position? 
     \p{Ll}+    # Then match one or more letters", 
    new MatchEvaluator(ComputeReplacement), RegexOptions.IgnorePatternWhitespace); 

public String ComputeReplacement(Match m) { 
    // You can vary the replacement text for each match on-the-fly 
    return @"\0".ToUpper(); // or whatever is needed for uppercasing in .NET 
} 

Explicación:

(?<!  # assert that the string before the current position doesn't match: 
(?<!\\) # assert that we start at the first backslash in the series 
(?:\\\\)* # match an even number of backslashes 
\\   # match one backslash 
) 
\p{Ll}+  # now match any sequence of lowercase letters 
+0

Una cosa más: esta expresión regular modificará los modificadores in situ como '(? S)', y sospecho que '(? S)' no va a funcionar. trabaja correctamente Entonces, si tienes esos en tus expresiones regulares, este enfoque podría necesitar ser alterado. También producirá resultados no deseados con propiedades Unicode como '\ p {Ll}' ... –

+0

¿Esto no será mayúsculas para los nombres de grupos también? Tengo una restricción de que los nombres de grupos existentes en tienen que permanecer en el mismo caso que ya está configurado. – gouldos

+0

Sí, lo hará. Sin embargo, debería ser posible dar cuenta de eso. Espera un segundo; Editaré mi respuesta. –

Cuestiones relacionadas