乍一看,字面上理解好像replace只替换第一个出现的字符(受javascript的影响),replaceall替换所有的字符,其实大不然,只是替换的用途不一样。

这两者很容易搞混,在这里详细讲述下。

我们先看下JAVA_API的说明:

public String replace(char oldChar,char newChar)

使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。该替换从字符串的开头朝末尾执行,例如,用 "b" 替换字符串 "aaa" 中的 "aa" 将生成 "ba" 而不是 "ab"。

返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 而生成的。 如 果 oldChar 在此 String 对象表示的字符序列中没有出现,则返回对此 String 对象的引用。否则,创建一个新的 String 对象,用来表示与此 String 对象表示的字符序列相等的字符序列,除了每个出现的 oldChar 都被一个 newChar 替换之外。

public String replaceAll(String regex,String replacement)

使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的每个子字符串。此方法调用的 str.replaceAll(regex, repl) 形式产生与以下表达式完全相同的结果:
Pattern.compile(regex).matcher(str).replaceAll(repl)
参数:
regex – 用来匹配此字符串的正则表达式
返回:得到的 String
抛出: PatternSyntaxException – 如果正则表达式的语法无效。

有一点注意:执行了替换操作后,源字符串的内容是没有发生改变的.

replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串);

replaceAll的参数是regex,即基于规则表达式的替换,比如:可以通过replaceAll("\\d", "*")把一个字符串所有的数字字符都换成星号;

相同点:都是全部替换,即把源字符串中的某一字符或字符串全部换成指定的字符或字符串;

不同点:replaceAll支持正则表达式,因此会对参数进行解析(两个参数均是),如replaceAll("\\d", "*"),而replace则不会,replace("\\d","*")就是替换"\\d"的字符串,而不会解析为正则。


另外,如果replaceAll()和replaceFirst()所用的参数据不是基于规则表达式的,则与replace()替换字符串的效果是一样的,即这两者也支持字符串的操作;

用正则表达式仅仅是替换全部或替换第一个的话,用replaceAll或replaceFirst即可。

  简单举例如下: String src = new String("ab43a2c43d"); System.out.println(src.replace("3","f"));=>ab4f2c4fd. System.out.println(src.replace('3','f'));=>ab4f2c4fd. System.out.println(src.replaceAll("\\d","f"));=>abffafcffd. System.out.println(src.replaceAll("a","f"));=>fb43fc23d. System.out.println(src.replaceFirst("\\d,"f"));=>abf32c43d System.out.println(src.replaceFirst("4","h"));=>abh32c43d.

另外还有一个不同点:“\”在java中是一个转义字符,所以需要用两个代表一个。例如System.out.println( "\\" ) ;只打印出一个"\"。但是“\”也是正则表达式中的转义字符,需要用两个代表一个。所以:\\\\被java转换成\\,\\又被正则表达式转换成\,因此用replaceAll替换“\”为"\\",就要用replaceAll("\\\\","\\\\\\\\"),而replace则replace("\\","\\\\")。

如果只想替换第一次出现的,可以使用replaceFirst(),这个方法也是基于规则表达式的替换,但与replaceAll()不同的是,只替换第一次出现的字符串。

实际应用:

public static void main(String[] arg) throws OgnlException {String s =”sdf\\a\\aa”;//把s中的反斜杠\ 替换为\\System.out.println(s);System.out.println(s.replaceAll(“\\\\”, “\\\\\\\\”));System.out.println(s.replace(“\\”, “\\\\”));}

可以看出上面两种都返回相同的替换结果。
这 里的关键是String.replaceAll()是用regular expression 来作为参数的。但是java本身的字符串对于转义符\也有类似的处理。首先,java会把“\\\\”解释成一个字符串(其中包含两个char)——“\ \”这个就是你在JDK的文档里看到的。
接下来,由于replaceAll是以正则表达式作为参数,所以“\\”被解释成一个regex。对于一个regex来说这就代表着一个字符,就是“\”。对后面的那个8个\来说,最终会被解释成“\\”。
换言之,假设String.replaceAll()是以普通字符串,而不是regex作为参数,那么这样写代码: String target = source.replaceAll(‘\\’, ‘\\\\’); 就可以了。

性能比较:

如果我们能确定字符串替换,用replace性能略好!如果有大量不确定字符串,replaceAll+正则性能会更好!

(网上整理来的~)

Java---replace与replaceAll的区别相关推荐

  1. java replace和replaceAll的区别以及用法

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

  2. replace和replaceAll的区别

    String对象中的replace和replaceAll的区别? replace方法:支持字符和字符串的替换. public String replace(char oldChar, char new ...

  3. java中String字符串的替换函数:replace与replaceAll的区别

    例如有如下x的字符串 String x = "[kllkklk\\kk\\kllkk]"; 要将里面的"kk"替换为++,可以使用两种方法得到相同的结果 rep ...

  4. JAVA中REPLACE和REPLACEALL的区别(转)

    replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是: 1)replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharS ...

  5. java中replace和replaceAll的区别

    replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是: 1)replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharS ...

  6. Java中的Replace和ReplaceAll的区别

    replace和replaceAll是String类中提供的两种用于字符/字符串替换的方法.如果只从字面意思理解,很容易误解为replace表示替换单个匹配项,而replaceAll表示替换所有匹配项 ...

  7. String 方法中 replace 和 replaceAll 的区别详解(源码分析)

    replace() 和 replaceAll() 都是常用的替换字符串的方法: 两者都是全部替换,即把源字符串中的某一字符或字符串全部换成指定的字符或字符串. 如果只想替换第一次出现的,可以使用 re ...

  8. JS 中 replace 和 replaceAll 的区别?

    方法解释 两种方法都返回一个新字符串,原始字符串保持不变.并且改方法可以传两个参数. 参数一:pattern. pattern 可以是一个 字符串 或一个 正则表达式, 参数二:replacement ...

  9. replace()和replaceAll()的区别

    相同点 都是全部替换,即把源字符串中的某一字符或字符串全部换成指定的字符或字符串,如果只想替换第一次出现的,可以使用 replaceFirst(),这个方法也是基于规则表达式的替换,但与replace ...

  10. replace与replaceAll的区别

    一.简述 [replace]的参数是 char 和 CharSequence,既支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,也就是字符串). [replaceAll ...

最新文章

  1. java-基础-强、软、弱、虚引用
  2. 价值1.4万元的课程讲义开源,fast.ai发布新书源代码,登GitHub趋势榜第一
  3. C#人爱学不学9[C#5.0异步实例+WPF自己的MVVM Async应用 1/12]
  4. 原创 | 科普一个 Star 数为 28.5k 的云原生网关
  5. bootstrap算法_决策树算法之随机森林
  6. ng-content的一个实际例子
  7. 每日一笑 | 为什么椅子总是最乱的?
  8. ActiveMQ queue 代码示例
  9. ionic 性能优化
  10. mysql5.5源码安装_MySQL5.5源码安装
  11. 一机三屏台式计算机,三屏系统重现江湖:背后一台完整主机
  12. linux配置erp访问端口_nginx配置相同端口号访问多个项目
  13. 导致Tomcat启动过程缓慢的原因及解决方法
  14. 【目标跟踪】基于卡尔曼滤波实现多车辆路径跟踪含Matlab源码
  15. 宏基4750网卡驱动linux,宏基4750g驱动下载-宏基4750g网卡驱动程序官方版 - 极光下载站...
  16. excel表格公式无效、不生效的解决方案及常见问题、常用函数
  17. 【104】DeepL翻译器-二十六国语言机器翻译工具
  18. wildcard函数
  19. 【二】gym初次入门一学就会---代码详细解析简明教程----平衡杆案例
  20. 高级加密标准 (AES) 和安全断言标记语言 (SAML) 的 Web 安全

热门文章

  1. CentOS防火墙配置方法-详细解读如何配置CentOS防火墙
  2. 做事先做人 --- 我的十三条军规
  3. StartSSL申请全过程 让网站拥有免费SSL证书
  4. IntelliJ IDEA导入多个eclipse项目到同一个workspace下
  5. CSS------li中的宽和高无法修改问题
  6. OSChina 周六乱弹 ——土肥圆装高富帅相亲节目现场拆穿
  7. [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)...
  8. 健康日志之口腔粘膜----7-13
  9. 创建ContentProvider的详细步骤
  10. Free 4 months Serial License Key Of Outpost Security Suite Pro 8.1