2015-09-04 37 views
1

我正嘗試從POJO字段生成數據庫列名。例如,如果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 
+1

你需要把['matcher.appendTail(SB)'](http://docs.oracle.com/javase/7/docs/ api/java/util/regex/Matcher.html#appendTail%28java.lang.StringBuffer%29)。 – aioobe

回答

3

您可以使用下面的代碼,以達到你在短短的一行在做什麼: -

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

在上面的代碼:表達式\ p {上}將匹配每個大寫字母和與_UppercaseCharacter替換它。

按@Pedro皮涅羅,我們也可以這樣做: -

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

換句話說:''([A-Z])'' –

+0

是的,你也可以這樣做。編輯我的答案。 –

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

需要注意的是另一種選擇要做到這一點是使用谷歌番石榴的CaseFormat

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

正則表達式的工作,但這裏是gauva另一種簡單和更清潔的方式。

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")