7

以下代码使用Javareplace()中类的方法。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抛出异常。

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

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

为什么a.replaceAll("/", "\\\\");在前面的例子中没有发出这样的警告或这样的运行时异常,即使它有一个无效的模式?

4

2 回答 2

10

来自 Javadoc String.replaceAll

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

System.out.println(a.replaceAll("/", Matcher.quoteReplacement("\\")));
于 2012-10-17T18:56:08.600 回答
3

为什么这个方法在只使用两个斜杠时会抛出 java.lang.StringIndexOutOfBoundsException?

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

java.lang.StringIndexOutOfBoundsException当它尝试评估模式字符串 ITSELF ie\\并且找不到后续字符时,您的异常即将到来,这在这种情况下是强制性的。这不会出现在参数字符串上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++;
}
于 2012-10-17T19:02:27.570 回答