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(); } }
}
这样也很简单。。为什么不自己思考一下。。只要分割处理时候加一个步骤
[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]
用apache regexp吧..
RE r = new RE("(a*)b"); // Compile expression
boolean matched = r.match("xaaaab"); // Match against "xaaaab"
String wholeExpr = r.getParen(0); // wholeExpr will be 'aaaab'
String insideParens = r.getParen(1); // insideParens will be 'aaaa'
有很多种方式 我直接写好一个你拿去用就行了
[code="java"]
String str2 = "PROJECT_NAME";
// \是转义字符 后面写你想截取的字符
String[] arr str2.toLowerCase().split("\-.");
System.out.println("result: "+arr[0]+arr[1]);
[/code]
[code="java"]// \是转义字符 后面写你想截取的字符
String[] arr = str2.toLowerCase().split("\-."); [/code]
少了个赋值符 不好意思
汗。。这样简单的字符串操作不需要正则表达式吧。。
直接
[code="java"]
String str2 = "PROJECT_NAME";
String [] s = str2.toLowerCase().split("_"); //分割一下
str2 = s[0] + s[1].subString(0,1).toUpperCase( ) +s[1].subString(1);
[/code]