En Python, lors du formatage d'une chaîne, je peux remplir les espaces réservés par nom plutôt que par position, comme ça:
print "There's an incorrect value '%(value)s' in column # %(column)d" % \
{ 'value': x, 'column': y }
Je me demande si cela est possible en Java (espérons-le, sans bibliothèques externes)?
%s
était une pratique courante. fr.wikipedia.org/wiki/Printf_format_string#History Notez également que certains IDE et FindBugs peuvent détecter automatiquement les décomptes de% s et% d, mais je préférerais toujours les champs nommés.Réponses:
StrSubstitutor of jakarta commons lang est un moyen léger de le faire à condition que vos valeurs soient déjà formatées correctement.
http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/text/StrSubstitutor.html
Ce qui précède entraîne:
"Il y a une valeur incorrecte '1' dans la colonne n ° 2"
Lorsque vous utilisez Maven, vous pouvez ajouter cette dépendance à votre pom.xml:
la source
${arg}
) au lieu de la syntaxe personnalisée ci-dessus (%(arg)
), le regex ne se compilera pas, ce qui est l'effet souhaité.pas tout à fait, mais vous pouvez utiliser MessageFormat pour référencer une valeur plusieurs fois:
Ce qui précède peut également être fait avec String.format (), mais je trouve un nettoyeur de syntaxe messageFormat si vous avez besoin de créer des expressions complexes, et vous n'avez pas besoin de vous soucier du type de l'objet que vous mettez dans la chaîne
la source
MessageFormat
est génial mais encombrant pour un contenu json relativement volumineuxUn autre exemple d'Apache Common StringSubstitutor pour un espace réservé nommé simple.
la source
replaceIn
les valeurs de remplacement dans un tampon: StringBuilder ou TextStringBuilder. Avec cette approche, tout le contenu du fichier ne sera pas chargé en mémoire.Vous pouvez utiliser la bibliothèque StringTemplate , elle offre ce que vous voulez et bien plus encore.
la source
'
char:unexpected char: '''
Pour les cas très simples, vous pouvez simplement utiliser un remplacement de chaîne codé en dur, pas besoin d'une bibliothèque là-bas:
ATTENTION : je voulais juste montrer le code le plus simple possible. Bien sûr, NE l'utilisez PAS pour du code de production sérieux où la sécurité est importante, comme indiqué dans les commentaires: l'échappement, la gestion des erreurs et la sécurité sont un problème ici. Mais dans le pire des cas, vous savez maintenant pourquoi l'utilisation d'une `` bonne '' bibliothèque est requise :-)
la source
Merci pour votre aide! En utilisant tous vos indices, j'ai écrit une routine pour faire exactement ce que je veux - un formatage de chaîne de type python à l'aide d'un dictionnaire. Puisque je suis novice en Java, tous les indices sont appréciés.
la source
formatPos
ne peut pas contenirformatKey
.Ceci est un ancien thread, mais juste pour mémoire, vous pouvez également utiliser le style Java 8, comme ceci:
Usage:
La sortie sera:
la source
.reduce()
traitement traite les résultats de substitution intermédiaires comme des chaînes de format à part entière, cette solution est vulnérable aux attaques de chaînes de format . Toute solution correcte doit effectuer un seul passage dans la chaîne de format.Exemple:
la source
.replaceAll()
rappels de substitution de chaîne .Je suis l'auteur d' une petite bibliothèque qui fait exactement ce que vous voulez:
Ou vous pouvez enchaîner les arguments:
la source
La méthode replaceEach d' Apache Commons Lang peut s'avérer utile en fonction de vos besoins spécifiques. Vous pouvez facilement l'utiliser pour remplacer les espaces réservés par leur nom avec cet appel de méthode unique:
Compte tenu du texte d'entrée, cela remplacera toutes les occurrences des espaces réservés dans le premier tableau de chaînes par les valeurs correspondantes dans le second.
la source
Vous pourriez avoir quelque chose comme ça sur une classe d'assistance de chaîne
la source
Ma réponse est de:
a) utilisez StringBuilder lorsque cela est possible
b) garder (sous n'importe quelle forme: l'entier est le meilleur, spéciall char comme la macro dollar, etc.) la position de "placeholder" et ensuite utiliser
StringBuilder.insert()
(quelques versions d'arguments).L'utilisation de bibliothèques externes semble exagérée et je pense que les performances sont considérablement dégradées lorsque StringBuilder est converti en String en interne.
la source
Sur la base de la réponse, j'ai créé la
MapBuilder
classe:puis j'ai créé une classe
StringFormat
pour le formatage de chaîne:que vous pourriez utiliser comme ça:
la source
J'ai également créé une classe util / helper (en utilisant jdk 8) qui peut formater une chaîne et remplacer les occurrences de variables.
Pour cela, j'ai utilisé la méthode Matchers "appendReplacement" qui effectue toute la substitution et effectue des boucles uniquement sur les parties affectées d'une chaîne de format.
La classe d'assistance n'est actuellement pas bien documentée avec javadoc. Je vais changer cela à l'avenir;) Quoi qu'il en soit, j'ai commenté les lignes les plus importantes (j'espère).
Vous pouvez créer une instance de classe pour une carte spécifique avec des valeurs (ou un préfixe de suffixe ou noKeyFunction) comme:
De plus, vous pouvez définir ce qui se passe si une clé dans la carte des valeurs est manquante (fonctionne dans les deux sens, par exemple un nom de variable erroné dans la chaîne de format ou une clé manquante dans la carte). Le comportement par défaut est une exception non vérifiée lancée (non cochée car j'utilise la fonction jdk8 par défaut qui ne peut pas gérer les exceptions cochées) comme:
Vous pouvez définir un comportement personnalisé dans l'appel du constructeur comme:
ou déléguez-le au comportement par défaut sans clé:
Pour une meilleure gestion, il existe également des représentations de méthodes statiques telles que:
la source
Il n'y a rien de intégré à Java au moment d'écrire ceci. Je suggérerais d'écrire votre propre implémentation. Ma préférence va pour une interface de générateur simple et fluide au lieu de créer une carte et de la transmettre à la fonction - vous vous retrouvez avec un joli morceau de code contigu, par exemple:
Voici une implémentation simple:
la source
Essayez Freemarker , bibliothèque de modèles.
la source
https://dzone.com/articles/java-string-format-examples String.format (inputString, [listOfParams]) serait le moyen le plus simple. Les espaces réservés dans la chaîne peuvent être définis par ordre. Pour plus de détails, consultez le lien fourni.
la source
Vous devriez jeter un œil à la bibliothèque officielle ICU4J . Il fournit une classe MessageFormat similaire à celle disponible avec le JDK, mais cette ancienne prend en charge les espaces réservés nommés.
Contrairement aux autres solutions proposées sur cette page. ICU4j fait partie du projet ICU qui est maintenu par IBM et régulièrement mis à jour. En outre, il prend en charge des cas d'utilisation avancés tels que la pluralisation et bien plus encore.
Voici un exemple de code:
la source
Il existe un plugin Java pour utiliser l'interpolation de chaîne en Java (comme dans Kotlin, JavaScript). Prise en charge Java 8, 9, 10, 11 ... https://github.com/antkorwin/better-strings
Utilisation de variables dans les littéraux de chaîne:
Utilisation d'expressions:
Utilisation des fonctions:
Pour plus d'informations, veuillez lire le projet README.
la source