【问题标题】: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。你想要的和你得到的似乎是一样的。

标签: java string replace escaping backslash


【解决方案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("'", "");
          

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

          【讨论】:

          • 这段代码是否真的从字符串中删除了'
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-27
          • 1970-01-01
          • 2014-09-25
          • 2017-09-14
          • 1970-01-01
          • 1970-01-01
          • 2011-12-25
          相关资源
          最近更新 更多