Java正式表达式如何得到当前替换掉的字符?

Java正式表达式如何得到当前替换掉的字符?

问题描述:

本意是想将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();
    }
}

}

这样也很简单。。为什么不自己思考一下。。只要分割处理时候加一个步骤

[code="java"] String str2 = "PROJECT_NAME";

String [] s = str2.toLowerCase().split("_"); //分割一下

str2 += s[0];
for(int i=1;i<s.length;i++){
s[i] = s[i].subString(0,1).toUpperCase( ) +s[i].subString(1);
str2 += s[i];
}
[/code]

用apache regexp吧..
RE r = new RE("(a*)b"); // Compile expression
boolean matched = r.match("xaaaab"); // Match against "xaaaab"

String wholeExpr = r.getParen(0); // wholeExpr will be 'aaaab'
String insideParens = r.getParen(1); // insideParens will be 'aaaa'

有很多种方式 我直接写好一个你拿去用就行了

[code="java"]
String str2 = "PROJECT_NAME";
// \是转义字符 后面写你想截取的字符
String[] arr str2.toLowerCase().split("\-.");

System.out.println("result: "+arr[0]+arr[1]);

[/code]

[code="java"]// \是转义字符 后面写你想截取的字符

String[] arr = str2.toLowerCase().split("\-."); [/code]
少了个赋值符 不好意思

汗。。这样简单的字符串操作不需要正则表达式吧。。
直接
[code="java"]
String str2 = "PROJECT_NAME";

String [] s = str2.toLowerCase().split("_"); //分割一下
str2 = s[0] + s[1].subString(0,1).toUpperCase( ) +s[1].subString(1);
[/code]