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:CSDN)

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

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

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

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

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

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

【JAVA】"骗人"的“replaceAll”的更多相关文章

  1. java replace和replaceAll

    replace和replaceAll是JAVA中常用的替换字符的方法 public String replace(char oldChar, char newChar)         在字符串中用n ...

  2. java OutOfMorryError (replaceAll)

    最近在使用string类中的replaceAll函数时碰到这个错误,由于string长度比较长,文本文档9M多,可以增加jvm的内存大小解决. 下面是一篇对OutOfMorryError错误的一些处理 ...

  3. java中的replaceAll方法注意事项

    replaceAll和replace方法参数是不同的,replace的两个参数都是代表字符串,replaceAll的第一个参数是正则表达式 replaceAll中需要注意的特殊字符: \ == \\\ ...

  4. java string中replaceAll替换特殊符号

    例如在mysql数据库中建表时表名不能使用特殊符号,'-','{}'等等,所以我们要筛选去掉 public static void main(String[] args) { String regEx ...

  5. java replaceAll之$替换

    最近,在开发一个伪代码翻译工具的过程中,遇到个问题,我们在伪代码中使用spring EL的规则,将非变量限定在${"1"}中,解析后根据上下文的类型转换为相应的java类型.在规则 ...

  6. Java String.replaceAll() 与后向引用(backreference)

    问题 昨天看到一篇博文,文中谈到一道 Java 面试题: 给定一字符串,若该字符串中间包含 "*",则删除该 "*":若该字符串首字符或尾字符为 "* ...

  7. Java String.replaceAll()方法

    声明  以下是java.lang.String.replaceAll()方法的声明 public String replaceAll(String regex, String replacement) ...

  8. Core Java 总结(字符和字符串类问题)

    所有代码均在本地编译运行测试,环境为 Windows7 32位机器 + eclipse Mars.2 Release (4.5.2) 2016-10-17 整理 字符,字符串类问题 正则表达式问题 J ...

  9. java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0

    使用repalceAll 方法出现java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0异常 ...

随机推荐

  1. Linux-vmware tools安装与cdrom挂载

    前述 昨天想直接复制虚拟机centos系统中命令行的内容到主机的txt文档上进行保存,发现不能实现虚拟机与主机之间的直接通讯,后来查资料发现原来是由于我的虚拟机没有安装vwmare tools的缘故. ...

  2. atitit.插件体系设计总结o73.doc

    1. 两大类型:微内核(级联树形结构)与巨内核(管理容器,并联结构). 1 2. 通用插件接口 1 3. 插件的绑定and 初始化 2 4. 微内核插件平台设计 2 5. 参考 2 1. 两大类型:微 ...

  3. JAVA学习Swing章节标签JLabel中图标的使用

    package com.swing; import java.awt.Color; import java.awt.Component; import java.awt.Container; impo ...

  4. javascript必须懂之冒泡事件

    在学习javascript中,如果在事件的使用上出现一些反差效果,不良效果,如鼠标的移入移出时,显示你所需要的内容, 但就是没有出现,然而你不断的检查代码,逐个代码查错,还在浏览器的调试工具中调试都没 ...

  5. 分页sql语句优化

    MySQL的limit工作原理就是先读取n条记录,然后抛弃前n条,读m条想要的,所以n越大,性能会越差. 一般的分页做法,测试耗时 10.961s   SELECT * FROM v_history_ ...

  6. 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(二)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...

  7. vba中MsgBox的参数及用法

    1.作用    在消息框中显示信息,并等待用户单击按钮,可返回单击的按钮值(比如“确定”或者“取消”).通常用作显示变量值的一种方式.2.语法       MsgBox(Prompt[,Buttons ...

  8. GBK、UTF8、UNICODE编码转换

    string GBKToUTF8(const std::string& strGBK) { , strGBK.c_str(), -, NULL, ); WCHAR * wszUTF8 = ne ...

  9. PHP —— 读取文件到二维数组

    转自:PHP读取自定义ini文件到二维数组 读取文件,可以使用file_get_contents,file,parse_ini_file等,现在有一个需求,需要读取如下格式的文件: [food] ap ...

  10. Word中怎么设置标题的自动编号

    转自: http://jingyan.baidu.com/article/4f7d5712c39c0a1a201927ea.html