Java使用占位符生成字符串

时间:2013-06-28 12:20:39

标签: java string

我正在寻找能够实现以下目标的东西:

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

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

你知道一个这样做的图书馆吗?

8 个答案:

答案 0 :(得分:52)

请参阅String.format方法。

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

答案 1 :(得分:26)

来自Apache Commons Lang的

StrSubstitutor可用于使用命名占位符进行字符串格式化:

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

https://commons.apache.org/proper/commons-lang/javadocs/api-3.4/org/apache/commons/lang3/text/StrSubstitutor.html

  

用值替换字符串中的变量。

     

此类接受一段文本并替换所有变量   在其中。变量的默认定义是$ {variableName}。   前缀和后缀可以通过构造函数和set方法进行更改。

     

变量值通常从地图中解析,但也可以   从系统属性解析,或通过提供自定义变量   解析器。

示例:

String template = "Hi ${name}! Your number is ${number}";

Map<String, String> data = new HashMap<String, String>();
data.put("name", "John");
data.put("number", "1");

String formattedString = StrSubstitutor.replace(template, data);

答案 2 :(得分:8)

有两种解决方案:

Formatter更新,即使它接管{40}年的printf() ......

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

使用Formatter的更多理由是您不需要单引号! MessageFormat要求您这样做。此外,Formatter通过String.format()有一个快捷方式来生成字符串,PrintWriter.printf()个包含System.outSystem.err的快捷方式默认为PrintWriter

答案 3 :(得分:7)

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

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

this other thread中的更多信息。

答案 4 :(得分:5)

你不需要图书馆;如果您使用的是最新版本的Java,请查看String.format

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

答案 5 :(得分:2)

如果您可以容忍其他类型的占位符(例如%s代替{}),则可以使用String.format方法:

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

答案 6 :(得分:0)

这可以在不使用库的情况下在一行中完成。请检查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

答案 7 :(得分:0)

Justas的答案已经过时,因此我要发布带有Apache文本共享的最新答案。

来自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);