Java用'(撇号/单引号)和\(反斜杠)一起替换问题

Posted

技术标签:

【中文标题】Java用\'(撇号/单引号)和\\(反斜杠)一起替换问题【英文标题】:Java replace issues with ' (apostrophe/single quote) and \ (backslash) togetherJava用'(撇号/单引号)和\(反斜杠)一起替换问题 【发布时间】:2011-09-09 15:19:45 【问题描述】:

我似乎遇到了问题。我有一个查询字符串,其值可以包含单引号。这将破坏查询字符串。所以我试图进行替换以将' 更改为\'

这是一个示例代码:

"This is' it".replace("'", "\'");

这个输出仍然是:

"This is' it".

它认为我只是在为引号做一个转义字符。

于是我尝试了这两段代码:

"This is' it".replace("'", "\\'");  // \\ for the backslash, and a ' char
"This is' it".replace("'", "\\\'"); // \\ for the backslash, and \' for the ' char

以上两种方法仍然产生相同的输出:

"This is' it"

我似乎只能让这个实际吐出一个斜线:

"This is' it".replace("'", "\\\\'");

结果:

"This is\\' it"

有什么建议吗?我只想用\' 替换'

看起来应该没那么难。

【问题讨论】:

你打错了吗?我看不出最后两个代码sn-ps有什么区别,而后者的结果似乎是你想要的。 "我有一个查询字符串" - 你的意思是一个 SQL 查询字符串吗?如果是这样,请使用 PreparedStatements 和参数化查询。这样您就不必自己处理转义这些字符了。 我支持 jwodder。你想要的和你得到的似乎是一样的。 【参考方案1】:

首先,如果您尝试对查询字符串的撇号进行编码,则需要对它们进行 URLEncoded,而不是使用前导反斜杠进行转义。为此使用URLEncoder.encode(String, String)(顺便说一句:第二个参数应始终为"UTF-8")。其次,如果您想用反斜杠撇号替换所有撇号实例,您必须使用前导反斜杠转义字符串表达式中的反斜杠。像这样:

"This is' it".replace("'", "\\'");

编辑:

我现在看到您可能正在尝试动态构建 SQL 语句。 不要这样做。您的代码将容易受到 SQL 注入攻击。而是使用PreparedStatement

【讨论】:

您假设他的意思是 HTTP 查询字符串。他可能会。他可能不会。 @user770404:那么这就是 SQL 吗?是的?如果是这样,你就错了。您应该使用PreparedStatement。您当前的策略容易受到 SQL 注入攻击。 如果这是一个应用程序,我完全同意。正如我所提到的,这只是一个在本地运行以测试 Web 应用程序的测试脚本。 谢谢亚萨。这似乎奏效了。如果我在将组合字符串/变量传递给语句时执行替换,则查询运行正常。 完成。非常感谢您的帮助。【参考方案2】:

使用"This is' it".replace("'", "\\'")

【讨论】:

撇号不需要转义。 这里不需要转义 ' 本身。只有反斜杠必须转义。 是的,这就是我希望使用的,但我的输出变成了:“这就是它”。由于某种原因,斜线没有放在输出中。 @user770404 输出是指将其发送到 System.Out?【参考方案3】:

我使用了一个技巧来处理撇号特殊字符。替换 ' for \' 时,您需要在撇号前放置四个反斜杠。

str.replaceAll("'","\\\\'");

【讨论】:

【参考方案4】:

如果你想在 javascript 中使用它,那么你可以使用

str.replace("SP","\\SP");

但是在 Java 中

str.replaceAll("SP","\\SP");

会完美运行。

SP:特殊字符

否则,您可以使用 Apache 的 EscapeUtil。它会解决你的问题。

【讨论】:

【参考方案5】:

记住stringToEdit.replaceAll(String, String) 返回结果字符串。它不会修改 stringToEdit,因为字符串在 Java 中是不可变的。要坚持任何更改,您应该使用

stringToEdit = stringToEdit.replaceAll("'", "\\'");

【讨论】:

【参考方案6】:

例子:

String teste = " 'Bauru '";

teste = teste.replaceAll("  '  ","");
JOptionPane.showMessageDialog(null,teste);

【讨论】:

【参考方案7】:

我用过

str.replace("'", "");

替换我的字符串中的单引号。它对我来说工作正常。

【讨论】:

这段代码是否真的从字符串中删除了'

以上是关于Java用'(撇号/单引号)和\(反斜杠)一起替换问题的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式使用 postgres regexp_replace() 用单引号替换反斜杠和单引号

bash中双引号单引号反撇号的用法

linux命令学习-引用符号(反斜杠,单引号'',双引号"")

每日linux命令学习-引用符号(反斜杠,单引号'',双引号"")

正则表达式

为啥SQL支持两个单引号以及反斜杠转义