如何在String.Format中转义%?

我在我的strings.xml文件中存储一个SQL查询,我想使用String.Format构build代码中的最后一个string。 SELECT语句使用一个像这样的东西:

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

为了格式化,我用%1 $ sreplace了'something',所以它变成:

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

我用反斜杠来避免单引号。 但是我无法逃避%符号。

我如何在我的strings.xml文件中包含一个类似的语句?

为了逃避% ,你需要把它加倍: %%

为了补充上述解决scheme,请使用:

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

这是一个更强大的正则expression式replace,不会取代input中已经加倍的%%。

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

我不敢相信现在这不是一个简单解决的问题,但是,嘿,这是我的捅刺

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

在将消息传递给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(); 

请注意,这可以处理任意数量的格式化字符,所以它会用%%,%%%replace%%%%,%%%%%和%%%%%%等。

它将留下任何已经逃脱的字符(例如%%,%%%%等)