【JAVA】"骗人"的“replaceAll”
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”的更多相关文章
- java replace和replaceAll
replace和replaceAll是JAVA中常用的替换字符的方法 public String replace(char oldChar, char newChar) 在字符串中用n ...
- java OutOfMorryError (replaceAll)
最近在使用string类中的replaceAll函数时碰到这个错误,由于string长度比较长,文本文档9M多,可以增加jvm的内存大小解决. 下面是一篇对OutOfMorryError错误的一些处理 ...
- java中的replaceAll方法注意事项
replaceAll和replace方法参数是不同的,replace的两个参数都是代表字符串,replaceAll的第一个参数是正则表达式 replaceAll中需要注意的特殊字符: \ == \\\ ...
- java string中replaceAll替换特殊符号
例如在mysql数据库中建表时表名不能使用特殊符号,'-','{}'等等,所以我们要筛选去掉 public static void main(String[] args) { String regEx ...
- java replaceAll之$替换
最近,在开发一个伪代码翻译工具的过程中,遇到个问题,我们在伪代码中使用spring EL的规则,将非变量限定在${"1"}中,解析后根据上下文的类型转换为相应的java类型.在规则 ...
- Java String.replaceAll() 与后向引用(backreference)
问题 昨天看到一篇博文,文中谈到一道 Java 面试题: 给定一字符串,若该字符串中间包含 "*",则删除该 "*":若该字符串首字符或尾字符为 "* ...
- Java String.replaceAll()方法
声明 以下是java.lang.String.replaceAll()方法的声明 public String replaceAll(String regex, String replacement) ...
- Core Java 总结(字符和字符串类问题)
所有代码均在本地编译运行测试,环境为 Windows7 32位机器 + eclipse Mars.2 Release (4.5.2) 2016-10-17 整理 字符,字符串类问题 正则表达式问题 J ...
- java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0
使用repalceAll 方法出现java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0异常 ...
随机推荐
- [jQuery学习系列五 ]5-Jquery学习五-表单验证
前言最近总是有一个感觉,虽然这些东西都自己学习并一个案例一个案例的去验证过了.但是总觉得不写成博客记录下来这些都不是自己的东西(心理作用,哈哈).所以每当学习或者复习相关的知识我都喜欢记录下来,下面开 ...
- 重新签名IPA ( iPhone )
提示:暂时不能用了,企业证书滥用 ios 企业证书 ipa 重新签名发布 1. 应用场景 当前有一个 未用企业证书签名的 ipa 文件,默认是不可以直接安装到设备上的:我们需要用企业版证书签名: 当前 ...
- Python:将utf-8格式的文件转换成gbk格式的文件
需求:将utf-8格式的文件转换成gbk格式的文件 实现代码如下: def ReadFile(filePath,encoding="utf-8"): with codecs.ope ...
- WIFI WPA1/2 Crack for Windows
0x00 前言 目前WIFI WPA破解主要 以“aircrack-ng”为代表,运行于Linux系统( 如Kali Linux ),Windows系统比较少见,主要是Windows系统下WIFI网卡 ...
- gson 自定义对象转换格式
有时候我们希望gson按照我们想要的方式转换,比如将日期转换为时间戳 class GsonBuilderUtil { public static Gson create() { GsonBuilder ...
- Docker实践(4)—network namespace与veth pair
network namespace 创建network namespace # ip netns add blue # ip netns list blue 添加网口到namespace 先创建v ...
- Hadoop map和reduce数量估算
Hadoop在运行一个mapreduce job之前,需要估算这个job的maptask数和reducetask数.首先分析一下job的maptask数,当一个job提交时,jobclient首先分析 ...
- 私有云android客户端2.1.2最新版本(ownCloud简体中文优化版)
通过安装Ubuntu16.04+LAMP+ownCloud9.1+SSL建立私有云,下载ownCloud android客户端最新源码,针对国际语言简体中文化,修改部分代码,并进行补充.优化,编译生成 ...
- A Simple MVVM Example[Forward]
In my opinion, if you are using WPF or Silverlight you should be using the MVVM design pattern. It i ...
- HL AsySocket 服务开发框架 - 业务逻辑层
一 概述 Socket服务只是提供一个网络传输服务. 业务逻辑层在整体架构中的位置在那里呢,如图: 网络层将解包后的消息包抛至业务逻辑层,业务逻辑层收到消息包后,解析消息类型,然后转入相应的处理流程处 ...