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("\\", "\\\\");
就会报正则表达式的错误。