【JAVA】"骗人"的“replaceAll”

时间:2023-03-08 17:06:33

Java String类中有个方法叫:replaceAll,从表面上看,他的意思是把所有的regex替换成replacement。

     public String replaceAll(String regex, String replacement) {
return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}

但事实上,它并没有做到:

     public static void main(String[] args) {
String str="aaa";
System.out.println(str.replaceAll("aa", "a"));
}

结果是:

aa

所以,这个方法是骗人的。

真正的replaceAll应该是这样的:

  void replaceAll(String str, String regex, String replacement) {
if (str.contains(regex)) {
str = str.replaceAll(regex, replacement);
replaceAll(str, regex, replacement);
} else {
System.out.println(str);
}
}

test.java

 public class test {

     public static void main(String[] args) {
String str = "aaattaaaa";
String regex = "aa";
String replacement = "a";
replaceAll(str, regex, replacement);
} public static void replaceAll(String str, String regex, String replacement) {
if (str.contains(regex)) {
str = str.replaceAll(regex, replacement);
replaceAll(str, regex, replacement);
} else {
System.out.println(str);
}
}
}

输出:

atta

tool:

    public static String replaceAll(String str, String regex, String replacement) {
if (str.contains(regex)) {
str = str.replaceAll(regex, replacement);
str=replaceAll(str, regex, replacement);
}
return str;
}

另外补充一个替换时出现的问题,如果需要字符串中的单斜杠'\'替换成双斜杠'\\',那么该这么写:

 str1 = str1.replaceAll("\\\\", "\\\\\\\\");

因为:(ref:****)

String 的 replaceAll() 方法,实际是采用正则表达式的规则去匹配的,

\\\\   ,java解析为\\交给正则表达式,   正则表达式再经过一次转换,把\\转换成为\

也就是java里面要用正则来表示一个\. 必须写成4个\

如果要表示\\,那就要写8个\

所以如果写成: str1 = str1.replaceAll("\\", "\\\\");

就会报正则表达式的错误。