标签 - java基础

java基础    2016-06-21 20:51:29    450    0    0

问题由来

今儿不小心在群里看到一位朋友发了下面的代码:
title
通过输出可以看到,这段代码的作用是把驼峰命名格式的字符串替换成下划线分割,这个功能比较简单,但是吸引我的却是他的代码。

  1. "createTime".replaceAll("([A-Z]+)","_$1")

这行代码其实很简单,就是调用了String类的replaceAll方法,方法的第一个参数是正则表达式,第二个参数是将要被替换成的新值。让我惊奇的是他代码中,replaceAll的第二个参数,也就是JDK文档中名为replacement的参数,竟然是”_$1”,这是什么鬼?还支持类似占位符这样的东西?我一直都不知道。。

问题探索

由于之前研究过一段正则表达式,通过观察replaceAll的第一个参数([A-Z]+),我猜想,这个应该是用到了正则表达式的分组,对应JDK中,就是java.util.regex.Matcher类的group()方法。
于是看了下String.replaceAll方法是如何实现的。
JDK源码如下:

  1. public String replaceAll(String regex, String replacement) {
  2. return Pattern.compile(regex).matcher(this).replaceAll(replacement);
  3. }

哦,原来它底层就是用了Matcher,只不过用的是Matcher自己的replaceAll方法。
去看它的文档:
title

原来这个方法的参数果然有鬼,看下实现代码:

  1. public String replaceAll(String replacement) {
  2. reset();
  3. boolean result = find();
  4. if (result) {
  5. StringBuffer sb = new StringBuffer();
  6. do {
  7. appendReplacement(sb, replacement);