2009-08-10 5 views
7

Je cherche un moyen d'utiliser la longueur d'un groupe de correspondance dans l'expression de remplacement avec la fonction C# regex.replace.Comment puis-je utiliser une valeur calculée dans une opération de remplacement RegEx en C#?

C'est, que puis-je remplacer ??? avec dans l'exemple suivant pour obtenir la sortie souhaitée ci-dessous?

Exemple:

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

sortie souhaitée

X - 3 

Note: Ceci est un exemple extrêmement artificiel/simplifié pour démontrer la question. Je réalise pour cet exemple qu'une expression régulière n'est pas la manière idéale de le faire. Juste me faire confiance que l'application de la réponse dans le monde réel fait partie d'un problème plus complexe qui nécessite l'utilisation d'un remplacement RegEx ici.

Répondre

8

Essayez d'utiliser la version de Regex.Replace qui appelle une fonction pour déterminer ce que le texte de remplacement doit être:

public string Replace(string, MatchEvaluator); 

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

La fonction pourrait alors regarder le texte correspondant (l'objet Match est fourni en tant qu'argument de la fonction d'évaluateur) et renvoie une chaîne avec la valeur calculée appropriée.

+0

Merci. Je pensais que je devais faire cela, mais avant de me lancer dans cette voie, je voulais juste voir s'il y avait un mot-clé reconnu par le remplacement pour rendre cette opération plus simple. Pourtant, vous avez mon upvote et si personne ne répond par un raccourci pour y parvenir, j'accepte cette réponse. – JohnFx

3

Essayez

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

l'exemple MatchEvaluator ci-dessous

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

(partiellement volé le livre de recettes expressions régulières - ma haha ​​bible)

+0

bien sûr, il s'agit d'un exemple très simple – NickAldwin

13

Si vous utilisez C# 3, vous pouvez créez simplement un MatchEvaluator à partir d'une expression 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, vous pouvez utiliser un délégué:

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 au moins la création d'un 'new MatchEvaluator' n'est pas nécessaire, l'expression lambda peut être utilisée directement. – Grastveit

+0

chaîne val = Regex.Replace ( "xxx", @ "(? x {1,6})", m => m.Groupes ["exes"]. Valeur [0] + "-" + m.Groups ["exes"]. Value.Length.ToString() ); –

Questions connexes