如何在String.Format中转义百分号(%)?

569

我将 SQL 查询语句存储在 strings.xml 文件中,想要在代码中使用 String.Format 生成最终的字符串。这个 SELECT 语句使用了 like,类似于以下内容:

SELECT Field1, Field2 FROM mytable WHERE Field1 LIKE '%something%'
为了格式化,我需要将“something”替换为%1$s,这样它就变成了:
SELECT Field1, Field2 FROM mytable WHERE Field1 LIKE \'%%1$s%\'

我用反斜杠来转义单引号,但是我无法转义百分号。

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


不要忘记正确转义 %s。 - Seva Alekseyev
36
SQL注入警报。 准备就绪。 - BalusC
他们将向自己的数据库注入,这里没有任何问题 ;) - Matthew
8
即使是你自己的数据库,也有可能不小心编写出有问题的查询语句,或者只是编写无法编译的查询语句。准备查询语句是一个很好的习惯。 - Rauni Lillemets
虽然它比String.format()慢,但您可能考虑使用MessageFormat() - ccpizza
3个回答

1180
为了避免使用百分号(%)的时候出现问题,您需要将其翻倍:改为两个百分号(%%)。

27

为了补充之前提到的解决方案,请使用:

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

1
这将替换已经加倍的%。请阅读其他答案。 - Toilal
6
为什么有人要逃离已经被逃离的东西?如果他想逃离,为什么不去真正做呢?也许他本意是想要两个百分号,这样正确的转义形式就应该是“%%%%”。 - David Balažic

6

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接