Ich habe eine Zeichenfolge wie s = "abc.def..ghi"
. Ich möchte das einzelne "." mit zwei .s. s.replace(".", "..")
ergibt jedoch "abc..def .... ghi". Wie kann ich das richtige Verhalten erhalten? Die Ausgabe, die ich suche, ist s = "abc..def..ghi"
.Ersetzen von Zeichen in einer Zeichenfolge, Java
Antwort
den Punkt nur ersetzen, wenn es durch zwei Zeichen
umgeben istString foo = s.replaceAll("(\\w)\\.(\\w)", "$1..$2");
Oder wie @Thilo kommentierte nur, wenn sie von zwei nicht Punkte
umgeben istString foo = s.replaceAll("([^.])\\.([^.])", "$1..$2");
Und den einzelnen Punkt durch zwei Punkte ersetzen, auch wenn der Punkt am Anfang/Ende von t ist er Zeichenfolge, verwenden Sie eine negative Vorschau und Lookbehind: (Beispiel String: .abc.def..ghi.
wird ..abc..def..ghi..
werden)
String foo = s.replaceAll("(?<!\\.)\\.(?!\\.)", "..");
s.replace("...","..");
s.replace("....","..");
Abhängig von Eingabemöglichkeiten ..
Ich meine, er muss diese nach dem ersten Anruf an Stelle verwenden. Außerdem muss er dem Eingabestrom einer solchen Zeichenfolge eine gewisse Kontrolle auferlegen, sonst kann ihm kein Parser auf der Welt helfen. –
Bitte werfen Sie einen Blick auf die Antwort von baao und überlegen Sie, ob Sie diese Antwort löschen möchten. –
Wenn Sie nicht wissen, wie es zu tun regex dann StringTokenizer
verwenden, um die Zeichenfolge zu spalten und wieder verketten mit ..
.
Code:
public static void main(String[] args) {
String s = "abc.def..ghi";
StringTokenizer s2 = new StringTokenizer(s, ".");
StringBuilder sb = new StringBuilder();
while(s2.hasMoreTokens())
{
sb.append(s2.nextToken().toString());
sb.append("..");
}
sb.replace(sb.length()-2, sb.length(), ""); // Just delete an extra .. at the end
System.out.println(sb.toString());
}
Ich weiß, dass der Code groß ist im Vergleich zu einer Linie regex, aber ich habe es für den Fall, wenn Sie irgendwelche Probleme mit regex haben. Wenn Sie denken, dass es langsamer als die angenommene Antwort ist, habe ich eine Start- und Endzeit mit System.currentTimeMillis()
gemacht und ich habe meine schneller. Ich weiß nicht, ob es Ausnahmen zu diesem Test gibt.
Wie auch immer, ich hoffe es hilft.
Ich glaube nicht, dass dies funktioniert, wenn Sie drei aufeinander folgende Punkte haben (obwohl, um fair zu sein, das erwartete Verhalten unterspezifiziert ist Ich nehme an, du möchtest sie als drei Punkte behalten und nicht in zwei Punkte verwandeln. – Thilo
@Thilo Ich habe Punkte mit Start, Ende und mit mehreren Punkten (> 3) dazwischen versucht. Es funktionierte. – SkrewEverything
@Thilo es ist 'a..b' – SkrewEverything
Verwenden Blick Arounds:
str = str.replaceAll("(?<!\\.)\\.(?!\\.)", "..")(
Die Regex liest als „ein Punkt, nicht mit einem Punkt vorangestellt, und nicht durch einen Punkt gefolgt“. Dies behandelt die Kantenfälle eines Punktes am Anfang/Ende und/oder umgeben von buchstäblich jedem anderen Zeichen.
Da Look-arounds keine Eingaben konsumieren, müssen Sie sich im Ersatzbegriff nicht mit Backreferenzen anfreunden.
- 1. Ersetzen von mehreren Zeichen aus einer Zeichenfolge in Java
- 2. Zeichen einer Zeichenfolge in einer Liste ersetzen
- 3. Zeichen in einer Zeichenfolge zu ersetzen
- 4. Java-Zeichen in einer Zeichenfolge
- 5. C#: rekursiv Zeichen in einer Zeichenfolge ersetzen
- 6. Mehrere Zeichen ersetzen in einer Zeichenfolge python
- 7. Wie einige Zeichen in einer Zeichenfolge ersetzen
- 8. Ersetzen Mehrere Zeichen in Zeichenfolge
- 9. Ersetzen ganze Zeichen in einer Zeichenfolge durch ein Zeichen
- 10. Ersetzen von Zeichen in einer Zeichenfolge während einer While-Schleife in Java
- 11. Ersetzen \ Zeichen in Zeichenfolge entfernen
- 12. Löschen von Zeichen aus einer Zeichenfolge in Java
- 13. Python 2: Ersetzen von Zeichen in einer Zeichenfolge
- 14. Ersetzen Sie nicht Englisch Zeichen in einer Zeichenfolge mit UTF-8 Zeichen in Android/Java
- 15. golang - Ersetzen Zeichenfolge Zeichen von Zahlen golang
- 16. Java regulären Ausdruck Zeichen in einer Zeichenfolge
- 17. ein Zeichen in Zeichenfolge ersetzen, ohne Funktion in .NET ersetzen
- 18. zählen bestimmte Zeichen in einer Zeichenfolge (Java)
- 19. Java-Zeichen Position in einer Zeichenfolge
- 20. AS2 Zeichenfolge ersetzen für Array von Zeichen?
- 21. Finden von Vorkommen von Zeichen in einer Java-Zeichenfolge
- 22. Java ersetzen Zeichen in einer Zeichenfolge mit Ausnahme des angegebenen Werts in einer Variablen
- 23. ersetzen Zeichen in Zeichenfolge mit Regex JS
- 24. auf einmal mehrere Zeichen in einer Zeichenfolge in Python ersetzen
- 25. Ersetzen Sie mehrere Zeichen in einer Zeichenfolge in Objective-C?
- 26. Rekursive ersetzen von einer Tabelle von Zeichen
- 27. Ersetzen bestimmter Zeichen in Zeichenfolge in Python
- 28. Ersetzen Sie bestimmte Zeichen in einer Zeichenfolge mit AngularJS
- 29. Java Ein Zeichen durch ein Zeichen ersetzen
- 30. Elegante Lösungen zum Ersetzen mehrerer Zeichen in einer Zeichenfolge
Können Sie eine gute "Erste Schritte mit Regex" Ressource empfehlen? – Adam
Ich tinke http://www.regular-expressions.info/ ist nicht so schlimm, obwohl es nicht sehr schön aussieht. Aber du wirst dort sehr viel finden. Der Lookahead/Behind wird hier erklärt: http://www.regular-expressions.info/lookaround.html @Adam – baao