我正在尝试从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
答案 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")