如何在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%%%%,%%%%%和%%%%%%等。
它将留下任何已经逃脱的字符(例如%%,%%%%等)