【JAVA】"骗人"的“replaceAll”
Java String类中有个方法叫:replaceAll,从表面上看,他的意思是把所有的regex替换成replacement。
1 public String replaceAll(String regex, String replacement) { 2 return Pattern.compile(regex).matcher(this).replaceAll(replacement); 3 }
但事实上,它并没有做到:
1 public static void main(String[] args) { 2 String str="aaa"; 3 System.out.println(str.replaceAll("aa", "a")); 4 }
结果是:
aa
所以,这个方法是骗人的。
真正的replaceAll应该是这样的:
1 void replaceAll(String str, String regex, String replacement) { 2 if (str.contains(regex)) { 3 str = str.replaceAll(regex, replacement); 4 replaceAll(str, regex, replacement); 5 } else { 6 System.out.println(str); 7 } 8 }
test.java
1 public class test { 2 3 public static void main(String[] args) { 4 String str = "aaattaaaa"; 5 String regex = "aa"; 6 String replacement = "a"; 7 replaceAll(str, regex, replacement); 8 } 9 10 public static void replaceAll(String str, String regex, String replacement) { 11 if (str.contains(regex)) { 12 str = str.replaceAll(regex, replacement); 13 replaceAll(str, regex, replacement); 14 } else { 15 System.out.println(str); 16 } 17 } 18 }
输出:
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; }
另外补充一个替换时出现的问题,如果需要字符串中的单斜杠'\'替换成双斜杠'\\',那么该这么写:
1 str1 = str1.replaceAll("\\\\", "\\\\\\\\");
因为:(ref:CSDN)
String 的 replaceAll() 方法,实际是采用正则表达式的规则去匹配的,
\\\\ ,java解析为\\交给正则表达式, 正则表达式再经过一次转换,把\\转换成为\
也就是java里面要用正则来表示一个\. 必须写成4个\
如果要表示\\,那就要写8个\
所以如果写成: str1 = str1.replaceAll("\\", "\\\\");
就会报正则表达式的错误。
If you have any questions about this article, welcome to leave a message on the message board.
Brad(Bowen) Xu
E-Mail : maxxbw1992@gmail.com