Wie ersetzt man String nur einmal ohne Regex in Java?
Ich ersetzen müssen, die eine dynamische Teilstring in einem größeren string, aber nur einmal (d.h. im ersten match). Die String-Klasse stellt nur replace()
ersetzt ALLE Instanzen des Teilstrings; es ist ein replaceFirst()
Methode, aber es dauert nur regexp anstatt des normalen string. Ich habe zwei Bedenken mit der Verwendung von regex:
1) meine substring ist dynamisch, so könnte enthalten seltsame Zeichen, die etwas bedeuten, sonst in regex, und ich will nicht viel mit Charakter zu entkommen.
2) dieser Austausch geschieht sehr oft, und ich bin mir nicht sicher, ob die Verwendung der regex auf die Leistung auswirkt. Ich kann nicht kompilieren der regex vorher, da die regex selbst ist dynamisch!
Ich muss hier etwas fehlt, da mir scheint das eine sehr einfache Sache... gibt es eine Methode replaceFirst die regelmäßige Einnahme string irgendwo sonst in der java-franework?
InformationsquelleAutor der Frage polyglot | 2009-10-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
bigString.indexof(smallString)
um den index des ersten Vorkommens des kleinen string in die große (oder -1, falls nicht vorhanden, in diesem Fall sind Sie fertig). Verwenden Sie dannbigString.substring
zu Holen Sie sich die Stücke der großen string vor und nach dem Spiel, und schließlichconcat
zu setzen, jene, die vor und nach Teile wieder zusammen, mit den beabsichtigten Ersatz in der Mitte.InformationsquelleAutor der Antwort Alex Martelli
Sollten Sie verwenden, bereits getestete und gut dokumentierte Bibliotheken zu Gunsten von das schreiben Ihrer eigenen code!
InformationsquelleAutor der Antwort Daniel Gerber
Als Laurence vorschlug, die Sie verwenden können
Pattern.quote
wie diese:Dieser erstellt eine neue regex, die buchstäblich entspricht dem Teilstring. Ein weiterer Ansatz ist, einfach zu kompilieren, die substring-als literal regex wie diese:
Diese möglicherweise etwas effizienter, aber auch etwas weniger klar.
Könnte man es auch manuell tun, da Sie nur wollen, zum ersetzen des ersten Vorkommens. Aber regexes sind ziemlich effizient, also nicht optimieren zu früh!
InformationsquelleAutor der Antwort Bennett McElwee
stellen Sie sicher, dass Sie auch ersetzen
\s
und$s
in die Ersatz-als auch. Dies ist wahrscheinlich das, was Sie wollen, da können Sie keine Untergruppen mit Ihnen()
's entfernt).InformationsquelleAutor der Antwort user1707094
Muster.zitieren scheint nicht in allen Fällen funktionieren. Versuchen Sie `Muster.Zitat(":-)");
InformationsquelleAutor der Antwort trans
StringBuilder-Klasse in java verwendet werden kann, sehr einfach zu tun, eine nicht-regex-basierte Ersetzung einer Zeichenfolge durch eine andere.
InformationsquelleAutor der Antwort Zerovian
Lösung mit
Pattern
Könnte man das auch ändern String.ersetzen Methode verwendet, die wörtliche interpretation der Zeichen, die ersetzt nur das erste vorkommen des
target
Zeichenfolge:Aus der Dokumentation der Muster.WÖRTLICHE:
Lösung ohne
Pattern
Den anderen und effizienter Weg, natürlich, ist die Verwendung Alex Martelli's Tipp, um die folgende Funktionalität:
Zeit der Messung
Basierend auf 10 läuft, die
replaceFirst2
- Methode ausgeführt, die über 5 mal schneller als diereplaceFirst1
Methode. Ich habe beide dieser Methoden in einer Schleife mit 100.000 wiederholt und erhielt die folgenden Ergebnisse, in Millisekunden:InformationsquelleAutor der Antwort dinomario10