String.replaceAll()
String.replaceAll()
String.replaceAll()
方法的定义和实现是这样的:
1 | public String replaceAll(String regex, String replacement) { |
第1个参数是正则表达式,第2个参数则是替换的字符串。
但并不是那么简单,实际上存在着坑点,方法注释里面说到:
1 | Note that backslashes ({@code \}) and dollar signs ({@code $}) in the |
简单点说,就是第2个参数 replacement
中,如果包含斜杠 \
或者 $
,那么它就不仅仅是一个普通的替换字符串。
一、特殊字符 $
$
在参数 replacement
中是特殊字符,可用于表示第1个正则参数匹配的子串。
比如说,$0
表示匹配的第一个子串:
1 | String s = "abc"; // abc |
第2个参数中的 $0
实际就是正则匹配子串 b
。
所以,$
在参数 replacement
中算是比较特殊的存在。
二、转义字符 \
那如果确实是要替换字符 $
,怎么办?
那就是用转义字符 \
,把 $
换成 \$
,$
就会被认为是普通字符了。
比如这样:
1 | String s = "abc"; // abc |
因此,参数 replacement
里面的斜杠 \
也是特殊字符,是专门用于转义的。
所以,\
出现在参数 replacement
时也需要注意转义的情况。
比如说,想要把 a,b,c
里面的 ,
替换成 \
,下面这种写法是不行的:
1 | String s = "a,b,c"; // a,b,c |
直接报错了,这是为什么?
- 首先,在 java 字符串表达式中,表示一个
\
字符,本身就需要转义,写成\\
- 其次,
replacement
这个参数自己也需要转义,所以还要给\\
再转义,写成\\\\
才行
所以,下面这种写法才是正常的:
1 | String s = "a,b,c"; // a,b,c |
总的来说,String.replaceAll()
方法的第二个参数 replacement
虽然不是正则表达式,但也是一种特殊的表达式,需要对 \
和 $
进行转义,所以写的时候会比一般字符串表达式写多一层转义。
String.replaceAll()