11

一般来说,关于 MessagingFormat 已经有几个问题,但我还没有找到任何可以回答我的问题的东西。我知道,单引号会破坏这种模式。如果您使用 MessageFormat 或 Log4j,则“不”之类的内容可能会破坏可能的占位符。

请参阅在字符串中,一对单引号可用于引用除单引号之外的任意字符。例如,模式字符串“'{0}'”表示字符串“{0}”,而不是 FormatElement。单引号本身必须在 String 中用双引号 '' 表示

简单的例子:

@Test
public void test() {
    String pattern = "{0} doesn't show values ( {1}, {2}, {3}, {4} )";
    final Object[] args = { "Testpattern", 100, 200, 300, 400 };
    System.out.println(MessageFormat.format(pattern, args));
    pattern = pattern.replaceAll("(?<!')'(?!')", "''");
    System.out.println("Replaced singlequotes: " + MessageFormat.format(pattern, args));
}

输出:

Testpattern doesnt show values ( {1}, {2}, {3}, {4} )
Replaced singlequotes: Testpattern doesn't show values ( 100, 200, 300, 400 )

因此,如果我使用正则表达式替换所有单引号,它将起作用。我刚刚编写了正则表达式,试图只使用正则表达式lookahead/lookbehind替换“单引号”。

正则表达式替换示例:

    doesn't -> doesn''t
    doesn''t -> doesn''t
    doesn'''t -> doesn'''t

我只是想知道,是否存在任何 apache-commons 实用程序(或任何其他库),它将为我处理“escapeSingleQuotes”而不是提供我自己的正则表达式......?

4

5 回答 5

17

它帮助我做这样的事情:

`doesn''t`
于 2014-01-30T09:11:34.947 回答
7

ICU 的建议是仅将 ASCII 撇号 (' U+0027) 用于转义语法字符,并将漂亮的单引号 (' U+2019) 用于消息模式中的实际撇号和单引号。

于 2015-08-22T04:03:45.893 回答
4

对于在string.xml中有Android问题的每个人,请使用 \'\' 而不是单引号。

于 2014-07-30T17:04:27.780 回答
3

由于我还没有找到另一个提供转义单引号 (' -> '') 的 API,我将继续使用我的正则表达式。

于 2013-07-12T06:49:07.380 回答
0

使用 Apache Commons Lang 包中的 escapeEcmaScript 方法。

请参阅堆栈溢出问题:

于 2013-07-09T09:40:21.370 回答