2009-08-10 8 views
7

Estoy buscando una forma de usar la longitud de un grupo de coincidencias en la expresión de reemplazo con la función C# regex.replace.¿Cómo puedo usar un valor calculado en una operación de reemplazo de RegEx en C#?

Es decir, ¿qué puedo reemplazar ??? con en el siguiente ejemplo para obtener el resultado deseado que se muestra a continuación?

Ejemplo:

val = Regex.Replace("xxx", @"(?<exes>x{1,6})", "${exes} - ???"); 

salida deseada

X - 3 

Nota: Este es un ejemplo extremadamente artificial/simplificada para demostrar la pregunta. Me doy cuenta de que para este ejemplo, una expresión regular no es la forma ideal de hacerlo. Solo confíe en mí que la aplicación de la respuesta en el mundo real es parte de un problema más complejo que requiere el uso de un reemplazo de RegEx aquí.

Respuesta

8

Trate de usar la versión de Regex.Replace que llama a una función para determinar lo que el texto de reemplazo debe ser:

public string Replace(string, MatchEvaluator); 

http://msdn.microsoft.com/en-us/library/aa332127(VS.71).aspx

La función podría entonces mirar el texto coincidente (el objeto Match se suministra como el argumento para la función del evaluador) y devolver una cadena con el valor calculado apropiado.

+0

Gracias. Estaba pensando que tenía que hacer eso, pero antes de seguir por ese camino, solo quería ver si había una palabra clave reconocida por Replace para hacer esta operación más simple. Aún así, tienes mi voto favorable y si nadie responde con una forma abreviada de lograr esto, aceptaré esta respuesta. – JohnFx

3

Trate

val = Regex.Replace("xxx", @"(?<exes>x{1,6})", new MatchEvaluator(ComputeReplacement)); 

con el ejemplo MatchEvaluator continuación

public String ComputeReplacement(Match matchResult) { 
    return matchResult.Value.Length.ToString(); 
} 

(robado parte de la Regular Expressions Cookbook - mi jaja biblia)

+0

por supuesto, este es un ejemplo muy simple – NickAldwin

13

Si está usando C# 3 se puede simplemente cree un MatchEvaluator a partir de una expresión lambda:

string val = Regex.Replace(
    "xxx", 
    @"(?<exes>x{1,6})", 
    new MatchEvaluator(
     m => m.Groups["exes"].Value[0] + " - " + m.Groups["exes"].Value.Length.ToString() 
    ) 
); 

En C# 2 se puede utilizar un delegado:

string val = Regex.Replace(
    "xxx", 
    @"(?<exes>x{1,6})", 
    new MatchEvaluator(
     delegate(Match m) { 
     return m.Groups["exes"].Value[0] + " - " + m.Groups["exes"].Value.Length.ToString(); 
     } 
    ) 
); 
+2

En C# 4, al menos no es necesario crear un 'nuevo MatchEvaluator', la expresión lambda se puede usar directamente. – Grastveit

+0

string val = Regex.Replace ( "xxx", @ "(? x {1,6})", m => m.Grupos ["exes"]. Valor [0] + "-" + m.Groups ["exes"]. Value.Length.ToString() ); –

Cuestiones relacionadas