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() 用单引号替换反斜杠和单引号
linux命令学习-引用符号(反斜杠,单引号'',双引号"")