Laden...

Regex.Replace: Anzahl der durchgeführten Ersetzungen herausfinden

Erstellt von christof.k vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.224 Views
C
christof.k Themenstarter:in
159 Beiträge seit 2005
vor 14 Jahren
Regex.Replace: Anzahl der durchgeführten Ersetzungen herausfinden

Hallo,

ich möchte gerne nach dem Aufruf einer Ersetzung ein Feedback, wie oft diese durchgeführt wurde.
Leider finde ich nur bei der Suchfunktion, dass ich dafür "Matches.Count" auswerten kann. Beim Replace gibt es kein Äquivalent.
Wenn ich aber zuerst eine Suche ausführe, um nur die Anzahl zu erhalten, dauert jede Ersetzung doppelt so lange.

Gibt es hier eine einfache Lösung?
Vielen Dank
Christof

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo christof.k,

ich möchte gerne nach dem Aufruf einer Ersetzung ein Feedback, wie oft diese durchgeführt wurde.

ich wüsste nicht, wie du bei Regex.Replace an diese Information kommen solltest.

Wenn ich aber zuerst eine Suche ausführe, um nur die Anzahl zu erhalten, dauert jede Ersetzung doppelt so lange.

Das muss nun nicht unbedingt sein. Wenn du Regex.Matches durchgeführt hast, weiß du ja, wo die Treffer sind und könntest daher die Ersetzungen per String/StringBuilder selbst durchführen. Das sollte - zumindest wenn das Matchen das aufwändige ist - deutlich schneller gehen, als ein Regex.Replace nachzuschieben.

herbivore

2.921 Beiträge seit 2005
vor 14 Jahren

Wenn Du uns mitteilst, warum Du zuerst eine Suche machst und dann die Ersetzung oder was Du eigentlich genau vorhast, gibt es bestimmt eine performante Lösung.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

C
christof.k Themenstarter:in
159 Beiträge seit 2005
vor 14 Jahren

Hallo,

eigentlich will ich wirklich nur wissen, wieviele Treffer es gegeben hat.
Ich dachte auch an einen MatchEvaluater und dort für jeden Match das Replace mit der gleichen Regex durchzuführen, leider klappt dass aber nicht mit lookarounds.....

Christof

1.361 Beiträge seit 2007
vor 14 Jahren

Das mit dem MatchEvaluator klingt doch ganz hilfreich.

leider klappt dass aber nicht mit lookarounds

Ich habs zwar nicht getestet, aber soetwas müsste doch funktionieren:


public static class RegexExtensions
{
	public static string Replace(this Regex expression, string input, string replacement, out int count)
	{
		int innerCount = 0;
		string output = expression.Replace(input, (m) => {innerCount++; return replacement;});
		count = innerCount;
		return output;
	}
}

Oder nicht?

beste Grüße
zommi

//Edit: Gleich noch als Extension-Method umgeschrieben

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo zommi,

das Problem ist, dass die Rückgabe eines MatchElevators nicht interpretiert wird, sondern quasi literal eingesetzt wird. Wenn in replacement also z.B. $1 vorkommen würde, würde beim normalen Replace das $1 durch den Inhalt der ersten Gruppe des Matches ersetzt werden. Bei deiner Methode würde einfach $1 im Endergebnis stehen.

Das Problem mit den lookarounds hast du behoben, aber dafür ein neues Problem mit den Ersetzungen geschaffen.

Meine persönliche Einschätzung wäre, dass Ersetzungen häufiger verwendet werden als lookarounds.

herbivore