Java用特定字符周围(前后)的大写字母替换字符

Dev*_*ter 3 java regex apostrophe uppercase

我有这种意见

word w'ord wo'rd
Run Code Online (Sandbox Code Playgroud)

我需要在单词的开头和正确的'字符后面(可以多次存在)将两个字符转换为大写.

我需要的输出(使用前面的例子)是

word W'Ord Wo'Rd
Run Code Online (Sandbox Code Playgroud)

我尝试了一个简单的模式

s.replaceAll("(\\w)(\\w*)'(\\w)", "$1");
Run Code Online (Sandbox Code Playgroud)

但是我无法将第1组和第3组转换为大写


编辑:在我发现主要问题中的一个小错误后,我编辑了@Wiktor Stribizew代码,以便包括我错过的案例.

Matcher m = Pattern.compile("(\\w)(\\w*)'(\\w)").matcher(s);
StringBuffer result = new StringBuffer();
while (m.find()) {
    m.appendReplacement(result, m.group(1).toUpperCase() + m.group(2) + "'" + m.group(3).toUpperCase());
}
m.appendTail(result);
s = result.toString();
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 11

您需要Matcher#appendReplacement在Java中使用才能处理匹配.这是一个例子:

String s = "word w'ord wo'rd";
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("\\b(\\w)(\\w*)'(\\w(?:'\\w)*)").matcher(s);
while (m.find()) {
    m.appendReplacement(result, 
        m.group(1).toUpperCase()+m.group(2) + "'" + m.group(3).toUpperCase());
}
m.appendTail(result);
System.out.println(result.toString());
// => word W'Ord Wo'Rd
Run Code Online (Sandbox Code Playgroud)

请参阅Java演示

模式分解:

  • \b - 领先的单词边界
  • (\w) - 第1组:单个字char
  • (\w*) - 第2组:零个或多个字符
  • ' - 单引号
  • (\w(?:'\w)*) - 第3组:
    • \w - 一个字char
    • (?:'\w)* - 零个或多个序列:
      • ' - 单引号
      • \w - 一个字char.

现在,如果你想让模式更加精确,你可以改变\w那些应该与小写字母匹配\p{Ll}\w那个,并且应该匹配任何字母\p{L}.该模式看起来像"(?U)\\b(\\p{Ll})(\\p{L}*)'(\\p{Ll}(?:'\\p{Ll})*)"- 但是,如果在小写'字母之前有大写字母(如in wo'r'D's- > Wo'R'D's),则可能会将字母保留为小写字母(后面的字母).(?U)是一个Pattern.UNICODE_CHARACTER_CLASS内联修饰符,使\b字边界可识别Unicode.