Ich habe bemerkt, dass es ein Jahr war, seit das aktiv war, aber für das, was es wert ist. I came across an article on CodeProject heute behauptet, dieses Problem zu lösen - vielleicht können Sie Ideen von dort verwenden:
Ich kann nicht für seine Richtigkeit bürgen, aber könnte einen Blick wert sein.:)
Die Implementierung erfordert sicherlich die gesamte Zeichenfolge im Speicher zu halten, aber Sie können problemlos umgehen (wie bei jeder anderen Implementierung, die die Ersetzungen durchführt), solange Sie die Eingabe in Blöcke teilen und garantieren können, dass Sie nie Split an einer Position, die innerhalb ein Symbol ist, das ersetzt werden soll. (Eine einfache Möglichkeit, dass in Ihrem Fall zu tun ist, in einer Position zu spalten, wo das nächste Zeichen ist keine der in einem Symbol verwendet Zeichen.)
-
Es gibt einen Grund, über die Leistung (obwohl das ein ausreichender Grund in meinem Buch ist), eine "ReplaceMultiple" -Methode zu seiner String-Bibliothek hinzuzufügen: Einfach die Ersetzungsoperation N mal zu tun, ist im Allgemeinen NICHT korrekt.
Wenn die Werte, die für die Symbole, substituiert sind, sind nicht eingeschränkt, Werte können als Symbole behandelt in nachfolgenden Operationen ersetzen, am Ende wird. (Es könnte Situationen geben, in denen Sie das wirklich wollen, aber es gibt definitiv Fälle, in denen Sie das nicht tun. Das Verwenden seltsam aussehender Symbole reduziert die Schwere des Problems, löst es aber nicht und "ist hässlich" weil die zu formatierenden Zeichenketten benutzerdefinierbar sein können - und daher keine exotischen Zeichen erfordern sollten.)
Ich vermute jedoch, dass es einen guten Grund gibt, warum ich eine allgemeine Multi-Replace-Implementierung nicht leicht finden kann. Eine Operation "ReplaceMultiple" ist im Allgemeinen nicht (offensichtlich) gut definiert.
Um dies zu sehen, überlegen, was es könnte bedeuten zu "ersetzen" aa 'mit'! ' und 'baa' mit '?' in der Zeichenfolge 'abaa' "? Ist das Ergebnis 'ab!' oder ein?' - Oder ist ein solcher Ersatz illegal?
Man könnte verlangen, dass Symbole "Präfix-frei" sind, aber in vielen Fällen wäre das inakzeptabel. Angenommen, ich möchte damit einen Vorlagentext formatieren. Und sagen meine Vorlage ist für Code. Ich möchte "§table" durch einen Datenbanktabellennamen ersetzen, der nur zur Laufzeit bekannt ist. Es wäre ärgerlich, wenn ich jetzt "§t" nicht in der gleichen Vorlage verwenden könnte. Das Vorlagen-Skript könnte etwas völlig Generisches sein, und siehe da, eines Tages begegne ich dem Client, der tatsächlich "§" in seinen Tabellennamen verwendet hat ... was meine Vorlagen-Bibliothek möglicherweise weniger nützlich macht.
Eine vielleicht bessere Lösung wäre die Verwendung eines Recursive-Descent-Parser anstelle von Literalen. :)
Woher kommt die Zeichenfolge? – JoshD
Wie wir wissen, ist 'O (n) + O (n)' immer noch 'O (n)', was ist die * echte * Motivation hier? – Arun
Die tatsächliche Zeichenfolge/Daten ist möglicherweise 100s von Gigabyte in der Größe, inkrementell verarbeitet, und während der Aufruf zweimal ersetzen ist immer noch O (n), das n ist ziemlich groß. –