2009-08-10 6 views
7

Ich bin auf der Suche nach einer Möglichkeit, die Länge einer Vergleichsgruppe im ersetzenden Ausdruck mit der Funktion C# regex.replace zu verwenden.Wie kann ich einen berechneten Wert in einer RegEx-Ersetzungsoperation in C# verwenden?

Das ist, was kann ich ersetzen ??? mit dem folgenden Beispiel, um die unten gezeigte gewünschte Ausgabe zu erhalten?

Beispiel:

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

gewünschter Ausgang

X - 3 

Anmerkung: Dies ist ein äußerst contrived/vereinfachtes Beispiel der Frage zu demonstrieren. Ich erkenne für dieses Beispiel, dass ein regulärer Ausdruck nicht der ideale Weg ist, dies zu tun. Vertrauen Sie mir einfach, dass die reale Anwendung der Antwort Teil eines komplexeren Problems ist, das die Verwendung eines RegEx-Ersatzes erfordert.

Antwort

8

Versuchen Sie, die Version von Regex.Replace verwenden, die eine Funktion aufruft, um zu bestimmen, was der Ersatztext sein sollte:

public string Replace(string, MatchEvaluator); 

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

Die Funktion dann auf dem angepassten Text aussehen könnte (das Match Objekt geliefert wird als Argument für die Evaluator-Funktion) und gibt eine Zeichenfolge mit dem richtigen berechneten Wert zurück.

+0

Dank. Ich dachte, ich müsste das tun, aber bevor ich diesen Weg gegangen bin, wollte ich nur sehen, ob ein Schlüsselwort von replace erkannt wurde, um diese Operation einfacher zu machen. Trotzdem hast du meine Aufwertung und wenn niemand mit einer Kurzform antwortet, werde ich diese Antwort akzeptieren. – JohnFx

3

Versuchen

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

mit dem MatchEvaluator Beispiel unter

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

(teilweise aus dem Reguläre Ausdrücke Kochbuch gestohlen - meine Bibel haha)

+0

natürlich ist dies ein sehr einfaches Beispiel – NickAldwin

13

Wenn Sie C# 3 verwenden, können Sie Erstellen Sie einfach einen MatchEvaluator aus einem Lambda-Ausdruck:

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

In C# 2 können Sie einen Delegaten verwenden:

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

In C# 4 mindestens Erstellen eines 'neuen MatchEvaluator' ist nicht notwendig, kann der Lambda-Ausdruck direkt verwendet werden. – Grastveit

+0

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

Verwandte Themen