如何将pojo属性转换为数据库列名

时间:2015-09-04 21:19:07

标签: java regex

我正在尝试从POJO字段生成数据库列名。例如,如果pojo的字段为

origOrderDate --> ORIG_ORDER_DATE
custName --> CUST_NAME
firstOrigDatePort --> FIRST_ORIG_DATE_PORT
...
...

我有以下代码,

String testStr = "origOrderDate";
String regEx = "([A-Z])";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(testStr);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
    System.out.printf("Found %d, of capital letters in %s%n", matcher.groupCount(), testStr);
    matcher.appendReplacement(sb, "_$1");
}

System.out.println(sb.toString().toUpperCase());

它丢失了字符串的结尾部分。有什么想法吗?

ORIG_ORDER_D

3 个答案:

答案 0 :(得分:3)

您可以使用以下代码,在一行中实现您的目标: -

public static void main(String[] args){
       String testStr = "origOrderDate";
       String convertedString = testStr.replaceAll("(\\p{Upper})", "_$1").toUpperCase();
       System.out.println(convertedString);
   }

在上面的代码中:表达式\ p {Upper}将匹配每个大写字母,并将其替换为_UppercaseCharacter。

根据@Pedro Pinheiro,我们也可以: -

String convertedString = testStr.replaceAll("([A-Z])", "_$1").toUpperCase();

答案 1 :(得分:0)

您缺少matcher.appendTail以附加字符串的结尾。引用Matcher Javadoc:

  

appendReplacement和appendTail方法可以串联使用,以便将结果收集到现有的字符串缓冲区中

String testStr = "origOrderDate";
String regEx = "([A-Z])";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(testStr);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
    System.out.printf("Found %d, of capital letters in %s%n", matcher.groupCount(), testStr);
    matcher.appendReplacement(sb, "_$1");
}
matcher.appendTail(sb);
System.out.println(sb.toString().toUpperCase());

请注意,执行此操作的另一个选项是使用Google Guava的CaseFormat

CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, "origOrderDate");

答案 2 :(得分:0)

正则表达式会起作用,但这是另一种简单而清洁的方法。

import static com.google.common.base.CaseFormat.*;

String columnName = LOWER_CAMEL.to(UPPER_UNDERSCORE, "origOrderDate");

反向转换将是,

String fieldName = UPPER_UNDERSCORE.to(LOWER_CAMEL, "ORIG_ORDER_DATE")