【问题标题】:(Java) To replace with a slash, why are 4 slashes required in replacement argument of String's replaceAll method? [duplicate](Java) 用斜线替换,为什么 String 的 replaceAll 方法的替换参数需要 4 个斜线? [复制]
【发布时间】:2018-01-19 01:41:16
【问题描述】:

在 Java 中,字符串 "\\" 表示一个反斜杠,第一个反斜杠是转义字符。因此System.out.print("\\") 打印\。但是,如果 "\\" 在方法 replaceAll 中作为 replacement 参数给出,如在 "aba".replaceAll("b", "\\") 中,则会引发以下异常:java.lang.IllegalArgumentException: character to be escaped is missing

四个斜线就可以了。因此,如果打印"aba".replaceAll("b", "\\\\"),结果是a\a。但是为什么两个斜杠不正确呢?第一个斜线不是转义斜线,第二个斜线不是要转义的字符,就像System.out.print("\\")中的那样吗?请注意,对于传递给 replaceAll 的其他替换字符串,只有一个转义斜杠就足够了。例如。打印"aba".replaceAll("b", "\t") 结果为a a

注意:我使用的是 Java SE 9。

编辑:建议为重复的一些问题不是重复的。请不要将此与为什么在正则表达式中需要四个反斜杠来匹配单个反斜杠的问题混淆。这不是同一个问题,因为 replaceAll 中的第二个参数显然不是正则表达式。您无法使用正则表达式指定替换字符串,因为最终替换需要解析为文字字符串。

【问题讨论】:

  • 当你需要的只是replace时,为什么要使用replaceAll,它正在使用正则表达式
  • 替换不存在该问题。不过,问题并不取决于我的简单正则表达式。您可以使用需要 replaceAll 的更有趣的东西来修改示例。

标签: java replaceall


【解决方案1】:

答案是replaceAll 方法采用regualar expression 字符串,它有自己的\ 字符含义,因此您必须对其进行两次转义。

简单来说,"aba".replaceAll("b", "\t") 导致a a 的原因是\t 在正则表达式之前被解析为制表,因此在解析正则表达式时它只包含一个制表。

【讨论】:

  • 我不觉得这个答案令人满意,因为 replaceAll 的第二个参数不是正则表达式。但是,我至少找到了部分解释,它确实与替换字符串编码有关,而不仅仅是文字字符串。来自 Oracle,“调用 str.replaceAll(regex, repl) 形式的这种方法会产生与表达式 Pattern.compile(regex).matcher(str).replaceAll(repl)完全相同的结果>" 然后在 Matcher 的 Javadoc 中进行了更多解释:link
  • 来自here "替换字符串可能包含对捕获的子序列的引用,如在 appendReplacement 方法中。"。我认为这部分至关重要,因为要评估替换字符串以进行进一步的正则表达式匹配。
猜你喜欢
  • 2019-01-01
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 2023-03-16
  • 2017-02-25
  • 2016-06-20
相关资源
最近更新 更多