replace和replaceAll区别
replace和replaceAll区别:
  1)replace的参数是char和CharSequence,即可以⽀持字符的替换,也⽀持字符串的替换(CharSequence即字符串序列的意思,说⽩了也就是字符串);
  2)replaceAll的参数是regex,即基于规则表达式的替换,⽐如,可以通过replaceAll("\\d", "*")把⼀个字符串所有的数字字符都换成星号;
  相同点是都是全部替换,即把源字符串中的某⼀字符或字符串全部换成指定的字符或字符串,如果只想替换第⼀次出现的,可以使⽤ replaceFirst(),这个⽅法也是基于规则表达式
的替换,但与replaceAll()不同的是,只替换第⼀次出现的字符串;
  另外,如果replaceAll()和replaceFirst()所⽤的参数据不是基于规则表达式的,则与replace()替换字符串的效果是⼀样的,即这两者也⽀持字符串的操作;
  还有⼀点注意:执⾏了替换操作后,源字符串的内容是没有发⽣改变的.
  举例如下:
  String src = new String("ab43a2c43d");
  System.out.place("3","f"));=>ab4f2c4fd.
  System.out.place('3','f'));=>ab4f2c4fd.
  System.out.placeAll("\\d","f"));=>abffafcffd.
  System.out.placeAll("a","f"));=>fb43fc23d.
  System.out.placeFirst("\\d,"f"));=>abf32c43d
  System.out.placeFirst("4","h"));=>abh32c43d.
  如何将字符串中的"\"替换成"\\":
  String msgIn;
  String msgOut;
  placeAll("\\\\","\\\\\\\\");
  原因:
  '\'在java中是⼀个转义字符,所以需要⽤两个代表⼀个。例如System.out.println( "\\" ) ;只打印出⼀个"\"。但是'\'也是正则表达式中的转义字符(replaceAll 的参数就是正则表
达式),需要⽤两个代表⼀个。所以:\\\\被java转换成\\,\\⼜被正则表达式转换成\。
  同样
  CODE: \\\\\\\\
  Java: \\\\
  Regex: \\
  将字符串中的'/'替换成'\'的⼏种⽅式:
  msgOut= placeAll("/", "\\\\");
  msgOut= place("/", "\\");
  msgOut= place('/', '\\');
你真的会⽤java replaceAll函数吗?
replace、replaceAll、replaceFirst这三个函数会java的同学估计都⽤过,笔者已经⽤了2年多,可是,我们真的懂他们吗?
概述⼀下他们三个的⽤法:
· replace(CharSequence target, CharSequence replacement),⽤replacement替换所有的target,两个参数都是字符串。
· replaceAll(String regex, String replacement),⽤replacement替换所有的regex匹配项,regex很明显是个正则表达式,replacement是字符串。
· replaceFirst(String regex, String replacement),基本和replaceAll相同,区别是只替换第⼀个匹配项。
接下来有个简单的需求,就是把源字符串中的a替换成\a,代码如下:
1 System.out.println("abac".replace("a", "\\a")); //\ab\ac
2 System.out.println("abac".replaceAll("a", "\\a")); //abac
3 System.out.println("abac".replaceFirst("a", "\\a")); //abac
字符串replace函数
结果让⼈⼤吃⼀惊,⽤了这么多年的替换,竟然有点蒙了。
源字符串是"abac",然后我们到"a",把它替换成\a,由于\是java转义字符,所以想表达\a必须写成"\\a",第⼀个反斜线将第⼆个反斜线转义成普通字符串。
三个替换表达式,只有第⼀个replace函数的结果是正确的,问题出在哪呢?
replaceAll和replaceFirst要求第⼀个参数是正则表达式,"a"既能理解成字符串a,也可以理解成正则表达式a,所以第⼀个参数没问题。
问题就出在第⼆个参数上,如果读者仔细阅读replaceAll函数的注释,会发现有如下说明:
Note that backslashes (\) and dollar signs ($) in the replacement string may cause the results to be different than if it were being treated as a literal replacement string; placeAll. Use java.
1 System.out.println("abac".replaceAll("a(\\w)", "$1$1")); //bbcc
2 System.out.println("abac".replaceFirst("a(\\w)", "$1$1")); //bbac
正则的含义假设读者可以读懂,可以看出,在第⼆个参数中,可以⽤$符号获取分组的内容,本例中⽤$1取到了第⼀个分组的内容,即a后边紧邻的字符。
因此,$符号在第⼆个参数中是有特殊含义的,乱写会报错:
1 System.out.println("abac".replaceAll("a(\\w)", "$")); //Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
那假如我就想替换成$呢?这就需要转义字符:
1 System.out.println("abac".replaceAll("a", "\\$")); //$b$c
到这,读者可能会恍然⼤悟,原来反斜线在第⼆个参数中也有特殊含义(转义),所以如果我们想表达反斜线,就必须再转义⼀次:
1 System.out.println("abac".replaceAll("a", "\\\\a")); //\ab\ac
2 System.out.println("abac".replaceFirst("a", "\\\\a")); //\abac
简单理解⼀下,"\\\\a"中前边的反斜线分别转义后边的反斜线,让后边的反斜线就是普通字符串,这样在java内存中看到的字符串就是"\\a",然后replaceAll函数在处理时,再⽤前边的反斜线转义后边的反斜线,来表达后边的反斜线就是普通字符串,不是⽤来转义$的,最终内存中的字符串就是"\a",这样才可以成功将a替换成\a。
转义的问题确实纠结,通过本⽂,笔者希望读者以后使⽤这些函数时,能够保持清醒,能够意识到参数中的特殊字符,避免写出定时。
我的补充

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。