Eu tenho o seguinte modelo de string: "Hello [Name] Please find attached [Invoice Number] which is due on [Due Date]"
.
Também tenho variáveis String para nome, número da fatura e data de vencimento - qual é a melhor maneira de substituir os tokens no modelo pelas variáveis?
(Observe que se uma variável contém um token, ela NÃO deve ser substituída).
EDITAR
Com agradecimentos a @laginimaineb e @ alan-moore, aqui está minha solução:
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();
}
Respostas:
A maneira mais eficiente seria usar um matcher para encontrar continuamente as expressões e substituí-las e, em seguida, anexar o texto a um construtor de string:
fonte
Eu realmente não acho que você precisa usar um mecanismo de modelagem ou qualquer coisa assim para isso. Você pode usar o
String.format
método, assim:fonte
Infelizmente, o método confortável String.format mencionado acima está disponível apenas a partir do Java 1.5 (que deve ser bastante padrão hoje em dia, mas você nunca sabe). Em vez disso, você também pode usar a classe MessageFormat do Java para substituir os espaços reservados.
Ele suporta marcadores de posição no formato '{número}', então sua mensagem seria parecida com "Olá {0} Encontre em anexo {1} que vence em {2}". Essas Strings podem ser facilmente externalizadas usando ResourceBundles (por exemplo, para localização com vários locais). A substituição seria feita usando o método static'format 'da classe MessageFormat:
fonte
StringBuilder.append()
se pensei "Certamente há uma maneira melhor ... algo mais Pythônico ..." - e puta merda, acho que esse método pode ser anterior aos métodos de formatação do Python. Na verdade ... isso pode ser anterior a 2002 ... Não consigo descobrir quando isso realmente passou a existir ...Você pode tentar usar uma biblioteca de modelos como o Apache Velocity.
http://velocity.apache.org/
Aqui está um exemplo:
A saída seria:
fonte
Você pode usar a biblioteca de modelos para substituição de modelos complexos.
O FreeMarker é uma escolha muito boa.
http://freemarker.sourceforge.net/
Mas para tarefas simples, existe uma classe de utilitário simples que pode ajudá-lo.
org.apache.commons.lang3.text.StrSubstitutor
É muito poderoso, personalizável e fácil de usar.
Por exemplo, se você deseja substituir a variável de ambiente do sistema em uma string de modelo, aqui está o código:
fonte
Resultado: Olá, Junte-se! Você tem 10 mensagens "
fonte
Depende de onde os dados reais que você deseja substituir estão localizados. Você pode ter um mapa como este:
contendo todos os dados que podem ser substituídos. Em seguida, você pode iterar no mapa e alterar tudo na String da seguinte maneira:
Você também pode iterar sobre a String e encontrar os elementos no mapa. Mas isso é um pouco mais complicado porque você precisa analisar a String procurando por []. Você poderia fazer isso com uma expressão regular usando Pattern and Matcher.
fonte
fonte
Minha solução para substituir os tokens de estilo $ {variable} (inspirado nas respostas aqui e no Spring UriTemplate):
fonte
http://github.com/niesfisch/tokenreplacer
fonte
Com a Apache Commons Library, você pode simplesmente usar Stringutils.replaceEach :
Da documentação :
fonte
Para sua informação
Na nova linguagem Kotlin, você pode usar "Modelos de string" em seu código-fonte diretamente, nenhuma biblioteca de terceiros ou mecanismo de modelo precisa fazer a substituição de variáveis.
É uma característica da própria linguagem.
Consulte: https://kotlinlang.org/docs/reference/basic-types.html#string-templates
fonte
No passado, resolvi esse tipo de problema com os modelos StringTemplate e Groovy .
Em última análise, a decisão de usar um mecanismo de modelagem ou não deve ser baseada nos seguintes fatores:
Se alguma das situações acima se aplicar ao seu projeto, consideraria o uso de um mecanismo de modelos, a maioria dos quais fornece essa funcionalidade e muito mais.
fonte
eu usei
fonte
O seguinte substitui variáveis do formulário
<<VAR>>
, com valores pesquisados em um mapa. Você pode testá-lo online aquiPor exemplo, com a seguinte string de entrada
e os seguintes valores de variáveis
produz o seguinte
Aqui está o código
e, embora não seja solicitado, você pode usar uma abordagem semelhante para substituir variáveis em uma string por propriedades de seu arquivo application.properties, embora isso já possa estar sendo feito:
fonte