In Python kann ich beim Formatieren von Zeichenfolgen Platzhalter eher nach Namen als nach Position füllen:
print "There's an incorrect value '%(value)s' in column # %(column)d" % \
{ 'value': x, 'column': y }
Ich frage mich, ob das in Java möglich ist (hoffentlich ohne externe Bibliotheken).
java
string-formatting
Andy
quelle
quelle
%s
es gängige Praxis war. en.wikipedia.org/wiki/Printf_format_string#History Beachten Sie auch, dass einige IDE- und FindBugs automatisch nicht übereinstimmende% s- und% d-Zählungen erkennen, aber ich würde trotzdem benannte Felder bevorzugen.Antworten:
StrSubstitutor von jakarta commons lang ist eine leichte Methode, um dies zu tun, vorausgesetzt, Ihre Werte sind bereits korrekt formatiert.
http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/text/StrSubstitutor.html
Das Obige führt zu:
"Es gibt einen falschen Wert '1' in Spalte 2"
Wenn Sie Maven verwenden, können Sie diese Abhängigkeit zu Ihrer pom.xml hinzufügen:
quelle
${arg}
) anstelle der benutzerdefinierten Syntax oben (%(arg)
) verwenden, wird der reguläre Ausdruck nicht kompiliert, was der gewünschte Effekt ist.nicht ganz, aber Sie können MessageFormat verwenden, um einen Wert mehrmals zu referenzieren:
Das Obige kann auch mit String.format () gemacht werden, aber ich finde messageFormat Syntax Cleaner, wenn Sie komplexe Ausdrücke erstellen müssen, und Sie müssen sich nicht um den Typ des Objekts kümmern, das Sie in den String einfügen
quelle
MessageFormat
ist großartig, aber umständlich für relativ großeEin weiteres Beispiel für Apache Common StringSubstitutor für einfach benannte Platzhalter.
quelle
replaceIn
das Ersetzen von Werten in einen Puffer: StringBuilder oder TextStringBuilder. Bei diesem Ansatz wird nicht der gesamte Inhalt der Datei in den Speicher geladen.Sie können die StringTemplate- Bibliothek verwenden, sie bietet, was Sie wollen und vieles mehr.
quelle
'
Saibling:unexpected char: '''
In sehr einfachen Fällen können Sie einfach einen fest codierten String-Ersatz verwenden, ohne dass dort eine Bibliothek erforderlich ist:
WARNUNG : Ich wollte nur den einfachsten Code zeigen, der möglich ist. Verwenden Sie dies natürlich NICHT für seriösen Produktionscode, wenn Sicherheit wichtig ist, wie in den Kommentaren angegeben: Escape, Fehlerbehandlung und Sicherheit sind hier ein Problem. Aber im schlimmsten Fall wissen Sie jetzt, warum die Verwendung einer "guten" Bibliothek erforderlich ist :-)
quelle
Danke für deine Hilfe! Mit all Ihren Hinweisen habe ich eine Routine geschrieben, um genau das zu tun, was ich will - eine pythonähnliche Zeichenfolgenformatierung mit einem Wörterbuch. Da ich Java-Neuling bin, sind alle Hinweise willkommen.
quelle
formatPos
es nicht enthalten kannformatKey
.Dies ist ein alter Thread, aber nur für den Datensatz können Sie auch den Java 8-Stil wie folgt verwenden:
Verwendung:
Die Ausgabe wird sein:
quelle
.reduce()
Ergebnisse der Zwischenersetzung als eigene Formatzeichenfolgen behandelt werden, ist diese Lösung anfällig für Formatzeichenfolgenangriffe . Jede richtige Lösung sollte einen einzigen Durchgang durch die Formatzeichenfolge machen.Beispiel:
quelle
.replaceAll()
Rückrufe zum Ersetzen von Zeichenfolgen unterstützt .Ich bin der Autor einer kleinen Bibliothek , die genau das tut, was Sie wollen:
Oder Sie können die Argumente verketten:
quelle
Die replaceEach- Methode von Apache Commons Lang kann je nach Ihren spezifischen Anforderungen nützlich sein. Sie können damit einfach Platzhalter durch Namen durch diesen einzelnen Methodenaufruf ersetzen:
Bei einem bestimmten Eingabetext werden dadurch alle Vorkommen der Platzhalter im ersten Zeichenfolgenarray durch die entsprechenden Werte im zweiten ersetzt.
quelle
Sie könnten so etwas in einer String-Helfer-Klasse haben
quelle
Meine Antwort lautet:
a) Verwenden Sie nach Möglichkeit StringBuilder
b) Behalten Sie (in irgendeiner Form: Ganzzahl ist die beste, insbesondere Zeichen wie Dollar-Makro usw.) die Position des "Platzhalters" bei und verwenden Sie dann
StringBuilder.insert()
(wenige Versionen von Argumenten).Die Verwendung externer Bibliotheken scheint übertrieben und ich glaube, dass die Leistung erheblich beeinträchtigt wird, wenn StringBuilder intern in String konvertiert wird.
quelle
Basierend auf der Antwort habe ich eine
MapBuilder
Klasse erstellt:dann habe ich eine Klasse
StringFormat
für die String-Formatierung erstellt:was du so gebrauchen könntest:
quelle
Ich habe auch eine util / helper-Klasse (mit jdk 8) erstellt, die eine Zeichenfolge formatieren und das Auftreten von Variablen ersetzen kann.
Zu diesem Zweck habe ich die Matchers-Methode "appendReplacement" verwendet, die alle Ersetzungen vornimmt und nur die betroffenen Teile einer Formatzeichenfolge durchläuft.
Die Helferklasse ist derzeit nicht gut javadoc dokumentiert. Ich werde dies in Zukunft ändern;) Wie auch immer, ich habe die wichtigsten Zeilen kommentiert (hoffe ich).
Sie können eine Klasseninstanz für eine bestimmte Map mit Werten (oder Suffixpräfix oder noKeyFunction) wie folgt erstellen:
Außerdem können Sie definieren, was passiert, wenn ein Schlüssel in den Werten Map fehlt (funktioniert auf beide Arten, z. B. falscher Variablenname in Formatzeichenfolge oder fehlender Schlüssel in Map). Das Standardverhalten ist eine ausgelöste, nicht aktivierte Ausnahme (nicht aktiviert, da ich die Standardfunktion jdk8 verwende, die geprüfte Ausnahmen nicht verarbeiten kann) wie:
Sie können ein benutzerdefiniertes Verhalten im Konstruktoraufruf wie folgt definieren:
oder delegieren Sie es zurück an das Standardverhalten ohne Schlüssel:
Zur besseren Handhabung gibt es auch statische Methodendarstellungen wie:
quelle
Im Moment ist nichts in Java eingebaut. Ich würde vorschlagen, Ihre eigene Implementierung zu schreiben. Ich bevorzuge eine einfache, flüssige Builder-Oberfläche, anstatt eine Karte zu erstellen und sie an die Funktion zu übergeben. Am Ende erhalten Sie einen schönen zusammenhängenden Codeabschnitt, zum Beispiel:
Hier ist eine einfache Implementierung:
quelle
Probieren Sie Freemarker , Template-Bibliothek.
quelle
https://dzone.com/articles/java-string-format-examples String.format (inputString, [listOfParams]) wäre der einfachste Weg. Platzhalter in Zeichenfolgen können nach Reihenfolge definiert werden. Weitere Informationen finden Sie unter dem angegebenen Link.
quelle
Sie sollten sich die offizielle ICU4J-Bibliothek ansehen . Es bietet ein MessageFormat Klasse, die der mit dem JDK verfügbaren ähnelt, diese jedoch benannte Platzhalter unterstützt.
Im Gegensatz zu anderen auf dieser Seite bereitgestellten Lösungen. ICU4j ist Teil des ICU-Projekts , das von IBM verwaltet und regelmäßig aktualisiert wird. Darüber hinaus werden erweiterte Anwendungsfälle wie Pluralisierung und vieles mehr unterstützt.
Hier ist ein Codebeispiel:
quelle
Es gibt ein Java-Plugin zur Verwendung der String-Interpolation in Java (wie in Kotlin, JavaScript). Unterstützt Java 8, 9, 10, 11 ... https://github.com/antkorwin/better-strings
Verwenden von Variablen in Zeichenfolgenliteralen:
Verwenden von Ausdrücken:
Funktionen verwenden:
Für weitere Informationen lesen Sie bitte das Projekt README.
quelle