【问题标题】:better alternative to message format消息格式的更好替代方案
【发布时间】:2011-10-26 05:59:45
【问题描述】:

我有一串如下格式

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

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

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

【问题讨论】:

  • 现在我的代码是这样的:NewString=OlString.replace("{0}", "Value");...这是一种低效的方法吗?
  • 您是说您有一个不是有效 MessageFormat 的字符串(由于未转义的 { } 字符)但包含 MessageFormat 样式参数。此处发布的答案(包括您自己的答案)可能足以解决您的用例,但我不得不问这些格式错误的字符串最初是如何产生的?无论创建它们的人或进程都应该提供有效的 MessageFormat 字符串(也许您应该提供一个验证器);这比事后尝试修改字符串要强大得多。

标签: java escaping string-interpolation messageformat


【解决方案1】:

较新的 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);

【讨论】:

  • 现在我的代码是这样的:NewString=OlString.replace("{0}", "Value");...你认为这是一种低效的方法吗?
  • 这取决于你的 OIString 的大小,以及你有多少这些替换。如果只有一个替换,我认为它与使用 MessageFormat 或 Formatter 的成本大致相同。
  • 如果您只想替换 {0},这可能比使用更智能的方法更有效。但是这里的效率重要吗?
  • 这根本没用。在许多情况下 printf 样式是不够的,例如当您需要重复元素时。在包含重复元素的长消息中使用 printf 可能会很痛苦。这不是一个好的答案。
  • @FelipeMicaroniLalli 当然 printf 并不是解决所有问题的方法,但我认为它是解决手头问题的有效方法。
【解决方案2】:

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

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

可以,具体取决于您使用的参数类型。

如果您担心效率,请不要使用它(尤其是String.replaceAll)。如果您需要保留MessageFormat 的功能,我的解决方案很有用。一个有效的解决方案将解析输入字符串一次并识别应该引用哪些大括号。看看Pattern.replaceAll的源码是怎么做到的。

【讨论】:

    【解决方案3】:

    如果您不确切知道要使用什么字符串,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;
    }
    

    【讨论】:

      猜你喜欢
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多