我用以下方式去实现,但数字都被过滤掉了,请看:
public static String camelCase2USLCase(String clazzName)
{
Pattern p=Pattern.complie("[A-Z]+[a-z]*");
Macher m=p.matcher(clazzName);
StringBuilder sb=new StringBuilder();
while(m.find)
{
sb.append(m.group.toLowerCase()).append("_");
}
sb.deleteCharAt(sb.length()-1);
return sb.toString();
}

解决方案 »

  1.   

    那如果要从HeroSkill1变成 hero_skill1 呢?谢谢你的回复
      

  2.   

    public static String camelCase2USLCase(String clazzName) {
    return clazzName.replaceAll("([A-Z]+[a-z]*)", "$1_").toLowerCase();
    }
    这样涅
      

  3.   

    public static String camelCase2USLCase(String clazzName) {
    Pattern p = Pattern.compile("(^.*?)([A-Z]+[a-z]*)(.*$)");
    Matcher m;
    while ((m = p.matcher(clazzName)).matches()) {
    clazzName = m.group(1) + m.group(2).toLowerCase() + "_" + m.group(3);
    }
    return clazzName;
    }方法2
      

  4.   


    public static String camelCase2USLCase(String clazzName) {
    Matcher m;
    Pattern p = Pattern.compile("(^.*?)([A-Z]+[a-z]*)(.*$)");
    StringBuffer sb = new StringBuffer();
    while ((m = p.matcher(clazzName)).matches()) {
    clazzName = m.group(1) + m.group(2).toLowerCase() + "_" + m.group(3);
    }
    p = Pattern.compile("(^.*)_(.*$)");
    if ((m = p.matcher(clazzName)).matches()) {
    clazzName = m.group(1) + m.group(2);
    }
    return clazzName;
    }
      

  5.   

    谢谢回复,我使用了下,[A-Z]+[a-z\\d]* 也可以,不知和你的什么区别呢?
      

  6.   

    一样的逻辑
    []内表示范围的意思,可以出现a-z和数字效果等同于出现a-z或数字
      

  7.   

    public static void main(String[] args) {  String s = "HeroSkill1";
    String str = s.replaceAll("(\\w(?=[A-Z|0-9]))", "$1_").toLowerCase() ; 
    System.out.println(str);
    }