Java中的替换问题:如何同时处理单引号和反斜杠字符?

27

我遇到了问题。我的查询字符串中可能包含单引号,这会导致查询字符串出现错误。因此,我尝试使用替换将'更改为\'

以下是示例代码:

"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"

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

看起来应该不难。


1
你打错字了吗?我看不出最后两个代码片段之间有什么区别,而后者的结果似乎是你想要的。 - jwodder
4
"我有一个查询字符串" - 你是指SQL查询字符串吗?如果是,使用PreparedStatements和参数化查询。这样,您就不必自己处理转义这些字符的问题。 - Vineet Reynolds
我同意jwodder的观点。你想要的和你得到的似乎是相同的。 - MirroredFate
7个回答

36

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

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

编辑:

我现在明白你可能正在尝试动态构建一个SQL语句。不要这样做。你的代码将容易受到SQL注入攻击。相反,使用PreparedStatement


3
你认为他指的是HTTP查询字符串,但事实上他可能也有可能不是。 - user207421
由于一个下拉选择驱动另一个下拉值,为了使脚本通用,我随后使用之前选择的随机值并将其插入到另一个查询中。但是,如果之前的值包含单引号,则会终止传递的查询字符串,从而导致问题。 - derekmw
1
@user770404:那么这是SQL吗?是的话,你的方法不对。你应该使用“PreparedStatement”。你当前的策略容易受到SQL注入攻击的影响。 - Asaph
1
如果这是一个应用程序,我完全同意。正如我所提到的,这只是一个本地运行的测试脚本,用于测试Web应用程序。 - derekmw
1
谢谢Asaph。看起来这个方法可行。如果我在将组合的字符串/变量传递给语句时执行替换,那么查询就可以正常运行。 - derekmw
显示剩余7条评论

5

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


1
撇号不需要转义。 - Asaph
1
这里不需要转义 ' 本身,只需要转义反斜杠。 - Christian Semrau
是的,这就是我希望使用的,但输出变成了:“This is 'it'”。斜杠由于某种原因没有被放置在输出中。 - derekmw
你的意思是将输出发送到 System.Out 吗? - Marcelo

4

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

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

1
如果您想在JavaScript中使用它,则可以使用。
str.replace("SP","\\SP");

但在Java中
str.replaceAll("SP","\\SP");

这将完美地工作。

SP:特殊字符

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


0

示例:

String teste = " 'Bauru '";

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

0

记得 stringToEdit.replaceAll(String, String) 返回 结果字符串。这不会修改 stringToEdit,因为在 Java 中,字符串是不可变的。要使任何更改生效,应使用

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

-1

我已经使用过

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

替换字符串中的单引号。这对我来说很有效。


4
这段代码是否真正将字符串中的 ' 移除了? - Qwerty

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