Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Regex.Replace: Anzahl der durchgeführten Ersetzungen herausfinden
christof.k
myCSharp.de - Member



Dabei seit:
Beiträge: 160

Themenstarter:

Regex.Replace: Anzahl der durchgeführten Ersetzungen herausfinden

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo christof.k,
Zitat
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.
Zitat
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
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
christof.k
myCSharp.de - Member



Dabei seit:
Beiträge: 160

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
zommi
myCSharp.de - Member

Avatar #avatar-2617.png


Dabei seit:
Beiträge: 1380
Herkunft: Berlin

beantworten | zitieren | melden

Das mit dem MatchEvaluator klingt doch ganz hilfreich.
Zitat von christof.k
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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von zommi am .
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers