[Java-String]replace和replaceAll的区别以及反斜杠的使用

前言

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

1.replace

我们先看下该方法的表达式:

public String replace(char oldChar,char newChar)

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

该方法 的参数是 charCharSequence,即可以支持字符的替换,也支持字符串的替换(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  
throwPatternSyntaxException – 如果正则表达式的语法无效。

3.replaceFirst

replaceFirst()的参数和replaceAll的参数是一样的。

用正则表达式仅仅替换第一个的话,用 replaceFirst 即可。

4.转义字符反斜杠

反斜杠"\"Java中是一个转义字符,需要用两个代表一个。例如 System.out.println( "\\" ) ; 只打印出一个 "\"

"\" 也是正则表达式中的转义字符,需要用两个代表一个。所以:\\\\ java 转换成 \\\\ 又被正则表达式转换成 \

因此用 replaceAll 替换“\” "\\",就要用 replaceAll("\\\\","\\\\\\\\"),而 replacereplace("\\","\\\\")

实际使用如下:

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 + 正则性能会更好!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值