Gibt es einen besseren Weg, als String.Ersetzen entfernen backspaces aus einem string?
Ich habe einen string Lesen aus einer anderen Quelle, wie "\b\bfoo\bx". In diesem Fall wäre es zu übersetzen mit dem Wort "fox" als die ersten 2 \b ' s werden ignoriert, und das Letzte 'o' wird gelöscht, und dann ersetzt mit "x". Auch ein anderer Fall wäre "patt\b\b\b\b\b\b\b\b\b\bfoo" übersetzt werden sollte, um "foo"
Ich habe mit etwas Hilfe von String.Ersetzen, aber es ist Komplex, und ich bin besorgt, dass es nicht richtig funktioniert, es ist auch die Schaffung einer Menge neuer string-Objekte, die ich gerne vermeiden möchte.
Irgendwelche Ideen?
- Haben Sie sich überlegt mit einem regulären Ausdruck?
- Die regex würden Sie empfehlen? Ich bin auf der Suche nach einer eleganten Lösung. Fast jede Sprache/regex Geschmack ist fein, ich bin speziell mit einer Kombination aus Bash und Ruby-Skript, mein text-editor
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wahrscheinlich die einfachste ist, einfach mit der Iteration über den gesamten string. Angesichts Ihrer Eingaben, der folgende code funktioniert der trick in 1-pass -
Die Art, wie ich es tun würde, ist low-tech, aber einfach zu verstehen.
Erstellen Sie einen Stapel von Zeichen. Dann Durchlaufen Sie den string vom Anfang bis zum Ende. Wenn der Charakter ist ein normales Zeichen (non-slash), schieben Sie es auf den Stapel. Wenn es ein Schrägstrich, und das nächste Zeichen ist ein "b", "pop", die oben auf dem Stapel. Wenn der stack leer ist, ignorieren Sie es.
Am Ende, pop-jedes Zeichen wiederum, fügen Sie einen StringBuilder -, und Rückseite das Ergebnis.
Reguläre Ausdrücke-version:
Optimierte version (und dieser arbeitet mit backspace '\b' und nicht mit der Zeichenkette "\b"):
BEARBEITEN
Ich habe getan eine schnelle, grobe benchmark des Kodex in die Antworten so weit (Bearbeitung der zwei Beispiel-strings aus der Frage eine million mal jeweils):
Könnten Sie Durchlaufen den string rückwärts, so dass ein Zeichen-array, wie Sie gehen. Jedes mal, wenn Sie drücken Sie Rücktaste, Inkrementieren eines Zählers, und jedes mal schlagen Sie einem normalen Charakter, überspringen Sie es, wenn Ihr Zähler nicht null ist, und dekrementiert den Zähler.
Ich bin mir nicht sicher, was das beste C# - Daten-Struktur ist, diesen zu verwalten und dann in der Lage sein, um die Zeichenfolge in die richtige Reihenfolge, danach schnell.
StringBuilder
hat eineInsert
Methode, aber ich weiß nicht, ob es performant zu halten einfügen von Zeichen am Anfang oder nicht. Sie können die Zeichen in einem Stapel und schlugToArray()
am Ende -- das könnte oder könnte nicht schneller sein.ich würde so gehen:
code ist nicht getestet
Erstellen Sie ein StringBuilder-Objekt und kopieren Sie über alles, aber backspace chars.