6

我有以下格式的字符串

Select * where {{0} rdfs:label "Aruba" } limit 10

现在我想用一些新文本替换 {0},但问题是由于第一个大括号,消息格式无法解析字符串。我知道如果我使用 '{' 它会转义它,但问题是我有大量此类字符串,我无法在大括号前后手动添加单引号。即使我编写了一个函数来执行此操作,它也会转义占位符 {0} 的大括号。

它们是消息格式的更好替代方案,例如 ruby​​ 字符串插值。我只是想要一种编写字符串模板的方法,我可以在其中用新字符串替换某些部分

4

3 回答 3

3

较新的 Java 版本具有 java.util.Formatter 及其printf类似的方法。(它们的一些变体也散布在整个 API 中,例如 String.format 和 PrintStream.printf)。

你会在那里写

String some_text = "Hello";
String pattern = "Select * where {%s rdfs:label \"Aruba\" } limit 10";
String replaced = String.format(pattern, some_text);
于 2011-08-13T01:29:49.817 回答
1

MessageFormat用您的方法替换所有直接使用的。在您的方法中,查找花括号并根据上下文替换它们,然后再将其传递给MessageFormat. 像这样愚蠢的东西

s.replace("{", "'{'").replace("}", "'}'").replaceAll("'\\{'(\\d+)'\\}'", "{$1}")

可以做到,这取决于您使用的参数类型。

String.replaceAll如果您担心效率,请不要使用它(尤其是)。如果您需要保留MessageFormat. 一个有效的解决方案将解析输入字符串一次并识别应该引用哪些大括号。查看源代码Pattern.replaceAll以了解它是如何完成的。

于 2011-08-13T01:56:32.073 回答
0

如果您不确切知道要使用什么字符串,MessageFormat 使用起来很危险。无论你在做什么,任何一个{或标志的存在都会崩溃。}这是我写的一个小方法,只是因为我立即需要它。我没有检查过它的效率如何。通常连接到数据库的时间有 90% 都花在了响应请求上,所以如果某些东西在功能上是有效的,那么它通常是值得的。在仅 jvm 的应用程序中,您应该更加小心...

public formatMessage(String pattern, String... replacements ) {

    for(int i = 0; i < replacements.length; i++) {
        pattern = pattern.replace("{" + i + "}", replacements[i]);
    }

    return pattern;
}
于 2016-10-03T08:43:19.267 回答