【问题标题】:Difference in behaviour between String.replaceAll() and StringUtils.replace()String.replaceAll() 和 StringUtils.replace() 之间的行为差​​异
【发布时间】:2016-07-05 12:14:20
【问题描述】:

我想用转义单引号替换所有单引号。首先我尝试了String.replaceAll("\'", "\\'"),但没有成功。所以,我尝试了StringUtils.replace(String, "\'", "\\'"),它有效。

代码如下:

String innerValue = "abc'def'xyz";
System.out.println("stringutils output:"+StringUtils.replace(innerValue, "\'", "\\'"));
System.out.println("replaceAll output:"+innerValue.replaceAll("\'", "\\'"));

预期输出:

stringutils output:abc\'def\'xyz
replaceAll output:abc\'def\'xyz

实际输出:

stringutils output:abc\'def\'xyz
replaceAll output:abc'def'xyz

我只是好奇为什么String.replaceAll 没有用\' 替换'

【问题讨论】:

  • String.replaceAll 使用正则表达式,其中反斜杠具有特殊含义。使用replace 而不是reaplceAll
  • 提示:当标准 java 库调用不符合您的期望时;那么你的期望是错误的。解决这个问题的简单方法:RTFM。说真的,不要假设一个方法做这个或那个;只需阅读它的javadoc。或者:做一些先前的研究,比如在写一个新问题之前搜索这个网站。

标签: java string replaceall string-utils


【解决方案1】:

您不需要转义Strings 中的单引号(仅在char 值中),您需要使用替换值进行双双转义:

innerValue.replaceAll("'", "\\\\'")

这是由于replaceAll将正则表达式作为参数(第二个参数必须支持正则表达式进行反向引用)。

您也可以使用replace 成语,因为您没有使用正则表达式:

innerValue.replace("'", "\\'")

注意

replace 方法实际上在幕后使用了replaceAll,但是通过调用带有Pattern.LITERAL 标志的Pattern.compile 和在替换上的Matcher.quoteReplacement 将值转换为文字。

【讨论】:

    【解决方案2】:

    Java 字符串包 replaceAll 方法需要将正则表达式作为字符串参数。 而 Commons Lang StringUtils.replace 需要 String 值。

    当涉及到本地 Java 实现时,我们必须进行双重转义。 System.out.println("replaceAll 输出:"+innerValue.replaceAll("'", "\\'"));

    【讨论】:

      猜你喜欢
      • 2014-07-25
      • 2020-03-14
      • 2011-11-04
      • 2017-10-09
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多