J'ai le modèle suivant chaîne: "Hello [Name] Please find attached [Invoice Number] which is due on [Due Date]"
.
J'ai également des variables String pour le nom, le numéro de facture et la date d'échéance - quel est le meilleur moyen de remplacer les jetons du modèle par les variables?
(Notez que si une variable contient un jeton, elle ne doit PAS être remplacée).
ÉDITER
Merci à @laginimaineb et @ alan-moore, voici ma solution:
public static String replaceTokens(String text,
Map<String, String> replacements) {
Pattern pattern = Pattern.compile("\\[(.+?)\\]");
Matcher matcher = pattern.matcher(text);
StringBuffer buffer = new StringBuffer();
while (matcher.find()) {
String replacement = replacements.get(matcher.group(1));
if (replacement != null) {
// matcher.appendReplacement(buffer, replacement);
// see comment
matcher.appendReplacement(buffer, "");
buffer.append(replacement);
}
}
matcher.appendTail(buffer);
return buffer.toString();
}
Réponses:
Le moyen le plus efficace serait d'utiliser un matcher pour rechercher continuellement les expressions et les remplacer, puis d'ajouter le texte à un générateur de chaîne:
la source
Je ne pense vraiment pas que vous ayez besoin d'utiliser un moteur de création de modèles ou quelque chose du genre pour cela. Vous pouvez utiliser la
String.format
méthode, comme ceci:la source
Malheureusement, la méthode confortable String.format mentionnée ci-dessus n'est disponible qu'à partir de Java 1.5 (qui devrait être assez standard de nos jours, mais on ne sait jamais). Au lieu de cela, vous pouvez également utiliser la classe MessageFormat de Java pour remplacer les espaces réservés.
Il prend en charge les espaces réservés sous la forme "{numéro}". Votre message ressemblerait donc à "Bonjour {0} Veuillez trouver la pièce jointe {1} qui est due le {2}". Ces chaînes peuvent facilement être externalisées à l'aide de ResourceBundles (par exemple pour la localisation avec plusieurs locales). Le remplacement se ferait en utilisant la méthode statique'format 'de la classe MessageFormat:
la source
StringBuilder.append()
s et je pensais "Il y a sûrement une meilleure façon ... quelque chose de plus Pythonique ..." - et merde, je pense que cette méthode peut être antérieure aux méthodes de formatage de Python. En fait ... cela peut être plus ancien que 2002 ... Je ne peux pas trouver quand cela a réellement vu le jour ...Vous pouvez essayer d'utiliser une bibliothèque de modèles comme Apache Velocity.
http://velocity.apache.org/
Voici un exemple:
Le résultat serait:
la source
Vous pouvez utiliser la bibliothèque de modèles pour le remplacement de modèles complexes.
FreeMarker est un très bon choix.
http://freemarker.sourceforge.net/
Mais pour une tâche simple, il existe une classe utilitaire simple qui peut vous aider.
org.apache.commons.lang3.text.StrSubstitutor
Il est très puissant, personnalisable et facile à utiliser.
Par exemple, si vous souhaitez remplacer la variable d'environnement système dans une chaîne de modèle, voici le code:
la source
Sortie: Bonjour Rejoignez! Vous avez 10 messages "
la source
Cela dépend de l'emplacement des données réelles que vous souhaitez remplacer. Vous pourriez avoir une carte comme celle-ci:
contenant toutes les données pouvant être remplacées. Ensuite, vous pouvez parcourir la carte et tout modifier dans la chaîne comme suit:
Vous pouvez également parcourir la chaîne et trouver les éléments dans la carte. Mais c'est un peu plus compliqué car vous devez analyser la chaîne à la recherche du []. Vous pouvez le faire avec une expression régulière en utilisant Pattern et Matcher.
la source
la source
Ma solution pour remplacer les jetons de style $ {variable} (inspirée des réponses ici et du Spring UriTemplate):
la source
http://github.com/niesfisch/tokenreplacer
la source
Avec Apache Commons Library, vous pouvez simplement utiliser Stringutils.replaceEach :
De la documentation :
la source
FYI
Dans le nouveau langage Kotlin, vous pouvez utiliser des "Modèles de chaînes" directement dans votre code source, aucune bibliothèque tierce ou moteur de modèle n'a besoin de faire le remplacement de variable.
C'est une caractéristique de la langue elle-même.
Voir: https://kotlinlang.org/docs/reference/basic-types.html#string-templates
la source
Dans le passé, j'ai résolu ce genre de problème avec StringTemplate et Groovy Templates .
En fin de compte, la décision d'utiliser ou non un moteur de création de modèles doit être basée sur les facteurs suivants:
Si l'une des situations ci-dessus s'applique à votre projet, j'envisagerais d'utiliser un moteur de création de modèles, dont la plupart fournissent cette fonctionnalité, et plus encore.
la source
j'ai utilisé
la source
Ce qui suit remplace les variables du formulaire
<<VAR>>
, par des valeurs recherchées à partir d'une carte. Vous pouvez le tester en ligne iciPar exemple, avec la chaîne d'entrée suivante
et les valeurs de variable suivantes
produit ce qui suit
Voici le code
et bien que cela ne soit pas demandé, vous pouvez utiliser une approche similaire pour remplacer les variables d'une chaîne par les propriétés de votre fichier application.properties, bien que cela puisse déjà être fait:
la source