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.StringIndexOutOfBoundsException
exception即将发生,并且它找不到后续字符,在这种情况下这是必需的。 这不会出现在参数字符串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++; }