如何在 String.Format 中转义 %?

Posted

技术标签:

【中文标题】如何在 String.Format 中转义 %?【英文标题】:How to escape % in String.Format? 【发布时间】:2011-06-28 01:41:01 【问题描述】:

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

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 语句?

【问题讨论】:

别忘了正确地转义 %s。 SQL injection alert。 Prepare yourself. 他们会注入到他们自己的数据库中,这里不用担心 ;) 好吧,即使是你自己的数据库,也有可能不小心写出做坏事的查询。或者只是编写不编译的查询。准备查询是一个好习惯。 虽然它比String.format() 慢,但你可以考虑改用MessageFormat() 【参考方案1】:

要逃脱%,您需要将其加倍:%%

【讨论】:

【参考方案2】:

要补充上述解决方案,请使用:

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

【讨论】:

这将替换已经翻倍的 %。请阅读其他答案。 @Toilal 为什么有人会逃脱已经逃脱的东西?如果他愿意,为什么不实际去做呢?也许他打算有两个 % 符号,所以正确的转义形式是 '%%%%'【参考方案3】:

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

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

【讨论】:

以上是关于如何在 String.Format 中转义 %?的主要内容,如果未能解决你的问题,请参考以下文章

如何在VIM findsearch中转义反斜杠和正斜杠?[重复]

如何在 hive 查询的准备语句中转义?(问号)?

如何在 sed 中转义斜杠和双引号和单引号?

Postgresql在where子句中转义单引号[重复]

ASCII 到 HTML 实体在 Java 中转义

我应该在 Perl 中转义 shell 参数吗?