消息格式的更好替代品

时间:2011-08-13 01:20:25

标签: java escaping string-interpolation messageformat

我有以下格式的字符串

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

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

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

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

用您的方法替换MessageFormat的所有直接用途。在您的方法中,查找花括号并在将其传递给MessageFormat之前根据上下文替换它们。像

一样愚蠢的东西
s.replace("{", "'{'").replace("}", "'}'").replaceAll("'\\{'(\\d+)'\\}'", "{$1}")

可以做,取决于你正在使用什么类型的参数。

如果您关注效率,请不要使用此功能(尤其是String.replaceAll)。如果您需要保留MessageFormat的强大功能,我的解决方案非常有用。一个有效的解决方案是解析输入字符串一次并识别应引用哪些大括号。查看Pattern.replaceAll的源代码,了解如何完成。

答案 2 :(得分: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;
}