您需要使用
Matcher#appendReplacementJava才能处理匹配。这是一个例子:
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参见Java演示
相当于Java 9+(demo):
String s = "wo'rd w'ord wo'r'd";Matcher m = Pattern.compile("\b(\w)(\w*)'(\w(?:'\w)*)").matcher(s);System.out.println( m.replaceAll(r -> r.group(1).toUpperCase()+r.group(2) + "'" + r.group(3).toUpperCase()));//wo'rd w'ord wo'r'd => Wo'Rd W'Ord Wo'R'D//word w'ord wo'rd => word W'Ord Wo'Rd模式分解 :
b
-引导词边界(w)
-第1组:单字字符(w*)
-第2组:零个或多个字字符'
-单引号(w(?:'w)*)
-第3组:w
-一个字符(?:'w)*
-零个或多个序列:'
-单引号w
-一个字。
现在,如果要使模式更精确,则可以更改
w应该与匹配小写字母的和
p{Ll}与w匹配与任何小写字母的
p{L}。模式看起来像"(?U)\b(\p{Ll})(\p{L}*)'(\p{Ll}(?:'\p{Ll})*)"-但是,'如果小写字母之前有大写字母(例如
wo'r'D's->
中的字母),则冒着将字母小写()的风险
Wo'R'D's。
(?U)是
Pattern.UNICODE_CHARACTER_CLASS使
b单词边界能够识别Unipre
的内联修饰符。



