Java中的replace()和replaceAll()

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

 String a = "abc/xyz"; System.out.println(a.replace("/", "\\")); 

/在给定的String中, a被替换为\

如果我们使用replaceAll()方法,如下所示是同样的错误。

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

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

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

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


另一方面, split()方法最初发出一个waring 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. 

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

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

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

为什么a.replaceAll("/", "\\\\"); 如前面的情况一样,即使它的模式无效,也不会发出这样的警告或运行时exception?

来自Javadoc String.replaceAll

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

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

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

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

当您尝试评估模式字符串ITSELF\\时,您的java.lang.StringIndexOutOfBoundsExceptionexception即将发生,并且它找不到后续字符,在这种情况下这是必需的。 这不会出现在参数字符串a – > abc / xyz上,因为它试图在下面执行:

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