如何在String.Format中转义%?

时间:2011-02-16 02:31:33

标签: java android string syntax

我在我的strings.xml文件中存储SQL查询,我想使用String.Format在代码中构建最终字符串。 SELECT语句使用类似的东西:

SELECT Field1, Field2 FROM mytable WHERE Field1 LIKE '%something%'

为了格式化我用%1 $ s替换'something',所以它变为:

SELECT Field1, Field2 FROM mytable WHERE Field1 LIKE \'%%1$s%\'

我用反斜杠转义单引号。但是我无法逃脱%号。

如何在strings.xml文件中包含like语句?

4 个答案:

答案 0 :(得分:785)

要转义%,您需要将其加倍:%%

答案 1 :(得分:11)

要补充之前提出的解决方案,请使用:

str = str.replace("%", "%%");

答案 2 :(得分:0)

这是一个更强大的正则表达式替换,它不会替换已经在输入中加倍的%%。

str = str.replaceAll("(?:[^%]|\\A)%(?:[^%]|\\z)", "%%");

答案 3 :(得分:-3)

我现在不能相信这不是一个简单的解决问题,但是,嘿,这是我的抨击

(?:[^%]|^)(?:(%%)+|)(%)(?:[^%])

要在将消息传递给String.format之前清理消息,可以使用以下

Pattern p = Pattern.compile("(?:[^%]|^)(?:(%%)+|)(%)(?:[^%])");
Matcher m1 = p.matcher(log);

StringBuffer buf = new StringBuffer();
while (m1.find())
    m1.appendReplacement(buf, log.substring(m1.start(), m1.start(2)) + "%%" + log.substring(m1.end(2), m1.end()));

// Return the sanitised message
String escapedString = m1.appendTail(buf).toString();

请注意,这适用于任意数量的格式化字符,因此它将%%替换为%%,%%%替换为%%%%,%%% %%替换为%%%%%%等。

它会留下任何已经转义过的字符(例如%%,%%%%等)