Java中的replace()和replaceAll()

时间:2012-10-17 18:52:31

标签: java regex string replace replaceall

以下代码使用Java中replace()类的String方法。

String a = "abc/xyz";
System.out.println(a.replace("/", "\\"));
给定字符串/中的

a正在替换为\

如果我们使用replaceAll()方法,则同样的问题是错误的。

System.out.println(a.replaceAll("/", "\\"));

它会导致异常java.lang.StringIndexOutOfBoundsException被抛出。它需要两个额外的反斜杠\,如下所示,因为replaceAll()使用正则表达式而不是replace()方法的情况。

System.out.println(a.replaceAll("/", "\\\\"));

唯一的问题是为什么这个方法只用了两个斜杠,比如a.replaceAll("/", "\\")抛出java.lang.StringIndexOutOfBoundsException


另一方面,split()方法最初会发出警告Invalid regular expression: Unexpected internal error(我正在使用NetBeans 6.9.1)。

String b="abc\\xyz";
System.out.println(b.split("\\")[0]+b.split("\\")[1]); //Issues a warning as specified.

尝试运行此操作会导致抛出异常java.util.regex.PatternSyntaxException

由于它使用像replaceAll()这样的正则表达式,因此需要四个反斜杠。

System.out.println(b.split("\\\\")[0]+b.split("\\\\")[1]);

为什么a.replaceAll("/", "\\\\");不会像上一种情况那样发出这样的警告或运行时异常,即使它的模式无效?

2 个答案:

答案 0 :(得分:10)

来自Javadoc String.replaceAll

  

请注意,替换字符串中的反斜杠(\)和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同;见Matcher.replaceAll。如果需要,使用Matcher.quoteReplacement(java.lang.String)来抑制这些字符的特殊含义。

System.out.println(a.replaceAll("/", Matcher.quoteReplacement("\\")));

答案 1 :(得分:3)

  

为什么这个方法只使用这样的两个斜杠   a.replaceAll(“/”,“\”)抛出   java.lang.StringIndexOutOfBoundsException?

如您所知,\是正则表达式中的元字符。在正则表达式中使用\时,后面跟着另一个字符,例如\d or \s

当您尝试评估模式字符串ITSELF java.lang.StringIndexOutOfBoundsException它未找到后续字符时,您的\\例外即将发生,这是强制性的在这种情况下。这不会出现在参数字符串a - > abc / xyz as试图在下面做:

if (nextChar == '\\') {  //<-- \\ is read here
    cursor++;

    //<--Its attempting to read next character and fails
    nextChar = replacement.charAt(cursor); 
    result.append(nextChar);
    cursor++;
}