前言
乍一看,字面上理解好像 replace
只替换第一个出现的字符(受 javascript
的影响),replaceall
替换所有的字符,其实大不然,只是替换的用途不一样。其实replace
也是替换所有匹配的字符。
1.replace
我们先看下该方法的表达式:
public String replace(char oldChar,char newChar)
官方定义是使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。该替换从字符串的开头朝末尾执行,例如,用 "b"
替换字符串 "aaa"
中的 "aa"
将生成 "ba"
而不是 "ab"
。
该方法 的参数是 char
和 CharSequence
,即可以支持字符的替换,也支持字符串的替换(CharSequence
即字符串序列的意思, 说白了也就是字符串);
该方法返回一个新的字符串,它是通过用 newChar
替换此字符串中出现的所有 oldChar
而生成的。 如果 oldChar
在此 String
对象表示的字符序列中没有出现,则返回对此 String
对象的引用。否则,创建一个新的 String
对象。
2.replaceAll
我们先看下该方法的表达式:
public String replaceAll(String regex,String replacement)
该方法时使用给定的 replacement
字符串替换原字符串匹配给定的正则表达式的每个子字符串。
该方法的参数是 regex
,即基于正则表达式的替换,比如:可以通过 replaceAll("\\d", "*")
把一个字符串所有的数字字符都换成星号。
此方法调用的 str.replaceAll(regex, repl)
形式产生与以下表达式完全相同的结果:
Pattern.compile(regex).matcher(str).replaceAll(repl)
。
regex -- 用来匹配此字符串的正则表达式
return:得到的 String
throw: PatternSyntaxException – 如果正则表达式的语法无效。
3.replaceFirst
replaceFirst()
的参数和replaceAll
的参数是一样的。
用正则表达式仅仅替换第一个的话,用 replaceFirst
即可。
4.转义字符反斜杠
反斜杠"\"
在Java
中是一个转义字符,需要用两个代表一个。例如 System.out.println( "\\" )
; 只打印出一个 "\"
。
而 "\"
也是正则表达式中的转义字符,需要用两个代表一个。所以:\\\\
被 java
转换成 \\
,\\
又被正则表达式转换成 \
。
因此用 replaceAll
替换“\”
为 "\\"
,就要用 replaceAll("\\\\","\\\\\\\\")
,而 replace
则 replace("\\","\\\\")
。
实际使用如下:
public static void main(String[] arg) {
String s =“hello\\wolrd”;
System.out.println(s); // 输出为hello\wolrd
//把s中的反斜杠\ 替换为\\
System.out.println(s.replaceAll(“\\\\”, “\\\\\\\\”)); // 输出为hello\\wolrd
System.out.println(s.replace(“\\”, “\\\\”)); // 输出也为hello\\wolrd
}
这里的关键是 String.replaceAll()
是用 regular expression
来作为参数的。但是java
本身的字符串对于转义符\
也有类似的处理。首先,java
会把 “\\\\”
解释成一个字符串 (其中包含两个 char)——“\ \”
。
接下来,由于replaceAll
是以正则表达式作为参数,所以 “\\”
被解释成一个 regex
。对于一个 regex
来说这就代表着一个字符,就是“\”
。对后面的那个 8 个 \
来说,最终会被解释成“\\”
。
5. 总结
有一点注意: 执行了替换操作后, 源字符串的内容是没有发生改变的.
相同点:都是全部替换,即把源字符串中的某一字符或字符串全部换成指定的字符或字符串;
不同点:replaceAll
支持正则表达式,因此会对参数进行解析(两个参数均是),如 replaceAll("\\d", "*")
,就是把字符串中的数字全部改成星号。而 replace 则不会,replace("\\d","*")
就是替换 “\d” 的字符串,而不会解析为正则。
另外, 如果 replaceAll()
和 replaceFirst()
所用的参数据不是基于正则表达式的, 则与 replace()
替换字符串的效果是一样的, 即这两者也支持字符串的操作。
如果我们能确定字符串替换,用 replace
性能略好!如果有大量不确定字符串,replaceAll + 正则
性能会更好!