今儿不小心在群里看到一位朋友发了下面的代码:
通过输出可以看到,这段代码的作用是把驼峰命名格式的字符串替换成下划线分割,这个功能比较简单,但是吸引我的却是他的代码。
"createTime".replaceAll("([A-Z]+)","_$1")
这行代码其实很简单,就是调用了String类的replaceAll方法,方法的第一个参数是正则表达式,第二个参数是将要被替换成的新值。让我惊奇的是他代码中,replaceAll的第二个参数,也就是JDK文档中名为replacement的参数,竟然是”_$1”,这是什么鬼?还支持类似占位符这样的东西?我一直都不知道。。
由于之前研究过一段正则表达式,通过观察replaceAll的第一个参数([A-Z]+)
,我猜想,这个应该是用到了正则表达式的分组,对应JDK中,就是java.util.regex.Matcher
类的group()
方法。
于是看了下String.replaceAll方法是如何实现的。
JDK源码如下:
public String replaceAll(String regex, String replacement) {
return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}
哦,原来它底层就是用了Matcher,只不过用的是Matcher自己的replaceAll方法。
去看它的文档:
原来这个方法的参数果然有鬼,看下实现代码:
public String replaceAll(String replacement) {
reset();
boolean result = find();
if (result) {
StringBuffer sb = new StringBuffer();
do {
appendReplacement(sb, replacement);