用占位符生成字符串

我正在寻找一些东西来实现以下目标:

String s = "hello {}!";
s = generate(s, new Object[]{ "world" });
assertEquals(s, "hello world!"); // should be true

我可以自己写,但是在我看来,我曾经看到过一个库,可能是 slf4j 日志记录器,但是我不想写日志消息。我只想生成字符串。

你知道有个图书馆能做这个吗?

183872 次浏览

如果可以更改占位符的格式,则可以使用 String.format()。如果没有,也可以将其替换为预处理。

String.format("hello %s!", "world");

更多信息请参阅 另一条线

如果你可以容忍不同种类的占位符(比如 %s代替 {}) ,你可以使用 String.format方法:

String s = "hello %s!";
s = String.format(s, "world" );
assertEquals(s, "hello world!"); // true

有两种解决方案:

Formatter是最近,即使它接管了 printf()是40岁..。

您目前定义的占位符是 MessageFormat可以使用的,但是为什么要使用古老的技术呢?;)使用 Formatter

有更多的理由使用 Formatter,你不需要转义单引号!MessageFormat要求你这样做。此外,Formatter有一个通过 String.format()生成字符串的快捷方式,而 PrintWriter.printf()(其中包括 System.outSystem.err,它们在默认情况下都是 PrintWriter)

您不需要库; 如果您使用的是 Java 的最新版本,请查看 String.format:

String.format("Hello %s!", "world");

参见 String.format方法。

String s = "hello %s!";
s = String.format(s, "world");
assertEquals(s, "hello world!"); // should be true

这可以在不使用库的情况下在一行中完成。请检查 java.text.MessageFormat类。

例子

String stringWithPlaceHolder = "test String with placeholders {0} {1} {2} {3}";
String formattedStrin = java.text.MessageFormat.format(stringWithPlaceHolder, "place-holder-1", "place-holder-2", "place-holder-3", "place-holder-4");

输出将是

test String with placeholders place-holder-1 place-holder-2 place-holder-3 place-holder-4

Justas 的答案是过时的,所以我张贴了最新的答案与阿帕奇文本共享。

来自 Apache Commons Text 的 StringSubstitutor可用于具有命名占位符的字符串格式设置: Https://commons.apache.org/proper/commons-text/javadocs/api-release/org/apache/commons/text/stringsubstitutor.html

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.9</version>
</dependency>

这个类接受一段文本并替换所有变量 变量的默认定义是 ${ variableName }。 前缀和后缀可以通过构造函数和 set 方法进行更改。 变量值通常从映射中解析,但也可以是 从系统属性解析,或者通过提供自定义变量解析 解析器。

例如:

 // Build map
Map<String, String> valuesMap = new HashMap<>();
valuesMap.put("animal", "quick brown fox");
valuesMap.put("target", "lazy dog");
String templateString = "The ${animal} jumped over the ${target}.";


// Build StringSubstitutor
StringSubstitutor sub = new StringSubstitutor(valuesMap);


// Replace
String resolvedString = sub.replace(templateString);

https://stackoverflow.com/users/4290127/himanshu-chaudhary的建议非常有效:

String str = "Hello this is {} string {}";
str = MessageFormatter.format(str, "hello", "world").getMessage();
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.8.0-beta4</version>
</dependency>

如果您想使用一些字符串到不同的占位符,您可以使用如下指针:

String.format("%1$s %2$s %1$s", "startAndEndText", "middleText");

如果你是用户弹簧,你可以这样:

String template = "hello #{#param}";
EvaluationContext context = new StandardEvaluationContext();
context.setVariable("param", "world");
String value = new SpelExpressionParser().parseExpression(template, new TemplateParserContext()).getValue(context, String.class);
System.out.println(value);

输出:

hello world