本意是想将PROJECT_NAME等数据库列名转换成VO对应的属性名:projectName
String str2 = "PROJECT_NAME";
Pattern pattern = Pattern.compile("_.");
String strTemp = str2.toLowerCase();
Matcher matcher = pattern.matcher(strTemp);
System.out.println(matcher.replaceAll(pattern.pattern()));
matcher.replaceAll(pattern.pattern().substring(1))这里应该怎么写?
pattern.pattern()得到的是正式表达式字符串……

问题补充:
感谢几位的回答,可是还有其他的需求啊。
数据库列名可能有0,1,2甚至更多的下划线呢
AMOUNT
TOTAL_AMOUNT
YEAR_TOTAL_AMOUNT
……
我需要一个适合所有情形的解决方法呢,虽然可以按照其他方法实现,但是个人觉得正则表达式可能好些。
我最感兴趣的是matcher.replaceAll(someNewString)的时候,能不能够得到当前被替换掉的那部分字符……
比如TOTAL_AMOUNT变成total_amount后,被替换掉的应该是_a,我取得a再变成大写就可以圆满而优雅地完成任务了……

Any help?
问题补充:
自己研究了一下。像下面这样的代码是好像是可以将数据库列名转换成VO属性名,但是反过来则不行。while (matcher.find())循环中,使用matcher.group()可以得到当前被替换掉的字条,使用matcher.replaceFirst每次替换的结果都是在同一个位置替换,郁闷。
protected String changeName(String sourceName, boolean upDown) {
if (upDown) {
if (upDownPattern == null) {
upDownPattern = Pattern.compile("[A-Z]{1}");
}
String strTemp = sourceName;
Matcher matcher = upDownPattern.matcher(strTemp);
while (matcher.find()) {
// strTemp = matcher.replaceFirst("_" + matcher.group());
// matcher.reset();
strTemp = strTemp.replaceFirst(upDownPattern.pattern(), "_" + matcher.group());
}
return strTemp.toUpperCase();
} else {
if (downUpPattern == null) {
downUpPattern = Pattern.compile("_[a-z]{1}");
}
String strTemp = sourceName.toLowerCase();
Matcher matcher = downUpPattern.matcher(strTemp);
while (matcher.find()) {
strTemp = strTemp.replaceFirst(downUpPattern.pattern(), matcher.group().substring(1).toUpperCase());
}
return strTemp;
}
}
最后决定放弃采用正则表达式的做法。
public class NameUtils {
private NameUtils() {
}
/**
* 名字转换:数据库列名和VO属性名之间的转换
*
* @param sourceName
* @param upDown true 表示转换成数据库列名
* @return
*/
public static String changeName(String sourceName, boolean upDown) {
if (upDown) {
StringBuffer sbTemp = new StringBuffer(32);
for (int i = 0, size = sourceName.length(); i < size; i++) {
char c = sourceName.charAt(i);
if (Character.isUpperCase(c)) {
sbTemp.append("_").append(c);
} else {
sbTemp.append(c);
}
}
return sbTemp.toString().toUpperCase();
} else {
String strTemp = sourceName.toLowerCase();
String[] arTemp = strTemp.split("_");
StringBuffer sbTemp = new StringBuffer(32);
sbTemp.append(arTemp[0]);
for (int i = 1; i < arTemp.length; i++) {
sbTemp.append(arTemp[i].substring(0, 1).toUpperCase()).append(arTemp[i].substring(1));
}
return sbTemp.toString();
}
}
}