e_ville 2008-12-02 18:00
浏览 172
已采纳

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();
    }
}

}

  • 写回答

5条回答 默认 最新

  • playfish05 2008-12-03 16:43
    关注

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

    [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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用