2011-07-20 70 views
0

我需要改变这样的:"foo_bar_baz_2""fooBarBaz2"替换所有捕获组

我试图用这个模式:

Pattern pattern = Pattern.compile("_([a-z])"); 
Matcher matcher = pattern.matcher("foo_bar_baz_2"); 

是否有可能使用matcher以取代第一捕获组( '_'后面的字母与大写的被捕获组合]?

+0

是的,这是可能的(我猜的人谁知道Java的比我还可以告诉你如何)。我只想指出,使用这个正则表达式,你会得到'fooBarBaz_2',因为'[a-z]'不匹配'2'。 –

回答

3

您可以使用匹配的appendReplacement/appendTail方法是这样的:

Pattern pattern = Pattern.compile("_([a-z0-9])"); 
Matcher matcher = pattern.matcher("foo_bar_baz_2"); 

StringBuffer stringBuffer = new StringBuffer(); 
while(matcher.find()) { 
    matcher.appendReplacement(stringBuffer, matcher.group(1).toUpperCase()); 
} 
matcher.appendTail(stringBuffer); 

System.out.println(stringBuffer.toString()); 
3

是的。与\U$1\E替换 - 只要没有别的在您的正则表示为Java字符串"\\U$1\\E"

,你可以转储\E,缩短\U$1


考虑@考虑TimPietzcker的评论,你的正则表达式本身应该是"_([a-z0-9])"

1
StringBuffer sb = new StringBuffer(); 
while (matcher.find()) { 
    matcher.appendReplacement(sb, matcher.group(1).toUpperCase()); 
} 
matcher.appendTail(sb);