Java---replace与replaceAll的区别

网友投稿 989 2022-05-30

乍一看,字面上理解好像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---replace与replaceAll的区别

另外还有一个不同点:“\”在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(“\\”, “\\\\”));

}

性能比较:

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

(网上整理来的~)

Java 正则表达式

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:※【python自学】7个Python生态系统核心库,你值得拥有
下一篇:C++代码优化
相关文章