使用Java RegEx全局替换分组的匹配项

时间:2018-07-14 19:44:37

标签: java regex perl regex-lookarounds

我有一个PERL班轮。该Perl RegEx只是将给定句子的所有单词的首字母大写。

$val =~ s/\b(.)(.*?)\b/uc($1).$2/eg;

输入:

"united states corp"

输出

"United States Corp"

但是,我需要在JAVA中实现相同的功能。我正在关注。

String INPUT="united states corp"
Pattern p = Pattern.compile("\\b(.)(.*?)\\b");
Matcher m = p.matcher(INPUT);
if (m.find()) {
    INPUT = m.replaceAll(m.group(1).toUpperCase() + m.group(2));
}

输入:

"United States Corp".

输出:

"UnitedUnitedUnitedUnitedUnited"

谢谢。

1 个答案:

答案 0 :(得分:2)

要匹配单词的第一个小写字母(为了不匹配已经大写的单词),可以使用\b\p{Ll}正则表达式并使用Matcher#appendReplacement()方法来操作匹配:

String INPUT="united states corp";
Pattern p = Pattern.compile("\\b\\p{Ll}");
StringBuffer result = new StringBuffer();
Matcher m = p.matcher(INPUT);
while (m.find()) {
    m.appendReplacement(result, m.group().toUpperCase());
}
m.appendTail(result);
System.out.println(result.toString()); // => United States Corp

请参见Java demo

根据Java Matcher class docs

  

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

因此,如果您使用当前的正则表达式"\\b(.)(.*?)\\b",则需要将while (m.find())正文替换为

m.appendReplacement(result, m.group(1).toUpperCase() + m.group(2));