java - Java 中的 replace() 和 replaceAll()

标签 java regex string replace replaceall

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

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() 方法最初发出警告 无效的正则表达式:意外的内部错误(我使用的是 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("/", "\\\\"); 不会发出这样的警告或这样的运行时异常,即使它有一个模式无效?

最佳答案

来自 Javadoc String.replaceAll

Note that backslashes (\) and dollar signs ($) in the replacement string may cause the results to be different than if it were being treated as a literal replacement string; see Matcher.replaceAll. Use Matcher.quoteReplacement(java.lang.String) to suppress the special meaning of these characters, if desired.

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

关于java - Java 中的 replace() 和 replaceAll(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12941266/

相关文章:

java - Android: main.xml 错误

java - 无法在项目 nextrtc-signaling-serverrror 上执行目标 org.codehaus.mojo :exec-maven-plugin:1. 5.0:java (default-cli)

Java 设置 double 值而不进行四舍五入

Java许可证不能用于商业用途?

c# - 使用正则表达式的 n-gram

c - 使用向后 for 循环替换 C 中字符串的结尾

java - 分解任何字符串

regex - 有没有办法否定正则表达式?

regex - 查找模式并替换为模式 vim 之后的所有内容

java - 如何使用 Java 的 String.replaceAll 方法替换以 $ 字符开头的字符串