驼峰转下划线
- Ascii码依次比较法(Fastjson内部实现)
private String underline(String name) {
StringBuilder buf = new StringBuilder();
for (int i = 0; i < name.length(); ++i) {
char ch = name.charAt(i);
if (ch >= 'A' && ch <= 'Z') {
char ch_ucase = (char) (ch + 32);
if (i > 0) {
buf.append('_');
}
buf.append(ch_ucase);
} else {
buf.append(ch);
}
}
return buf.toString();
}
- guava 内部实现
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.0-jre</version>
</dependency>
System.out.println(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, "HelloWord");)
- 正则匹配替换
/**
* 将驼峰格式字符串转下划线格式
* @param str string 待处理字符串
* @return string 处理结果
*/
public static String underline(String str) {
//正则匹配大写字符转成小写并在前面加上下划线
Matcher matcher = AZ_PATTERN.matcher(str);
StringBuffer sb = new StringBuffer(str);
if (matcher.find()) {
sb = new StringBuffer();
//将当前匹配的子串替换成指定字符串,并且将替换后的子串及之前到上次匹配的子串之后的字符串添加到StringBuffer对象中
//正则之前的字符和被替换的字符
matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
//把之后的字符串也添加到StringBuffer对象中
matcher.appendTail(sb);
} else {
return sb.toString();
}
return underline(sb.toString());
}
速度总结
速度 1(ascii依次比较) > 2 (guava) > 3(正则),后续使用方式一
下划线转驼峰
- Ascii码依次比较法
private static String camel(String word) {
if (word == null) {
return null;
}
String[] split = word.split("_");
StringBuffer sb = new StringBuffer(word.length());
for (String s : split) {
char[] chars = s.toCharArray();
if(chars[0] >= 'A' && chars[0] <='Z'){
}else if(chars[0] >='a' && chars[0] <= 'z'){
chars[0] -=32;
}
sb.append(chars);
}
return sb.toString();
}
- guava 内部实现
System.out.println(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "hello_word");)
- 正则匹配替换
private static Pattern AZ_PATTERN = Pattern.compile("[A-Z]");
/**
* 将下划线格式字符串转驼峰格式
* @param str string 待处理字符串
* @return string 处理结果
*/
public static String camel(String str) {
//正则匹配下划线及后一个字符,删除下划线并将匹配的字符转成大写
Matcher matcher = UNDERLINE_PATTERN.matcher(str);
StringBuffer sb = new StringBuffer(str);
if (matcher.find()) {
sb = new StringBuffer();
//将当前匹配的子串替换成指定字符串,并且将替换后的子串及之前到上次匹配的子串之后的字符串添加到StringBuffer对象中
//正则之前的字符和被替换的字符
matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
//把之后的字符串也添加到StringBuffer对象中
matcher.appendTail(sb);
} else {
return sb.toString();
}
return camel(sb.toString());
}
速度总结
速度 1(ascii依次比较法) > 2 (guava) > 3(正则),后续使用方式一
guava方式比ascii方式速度慢点有限
Q.E.D.