Java用大写字母在特定字符前后(前后)替换字符
我有这种输入
word w'ord wo'rd我需要将单词开头和之后的'字符都转换为大写(可以多次存在)。
我需要的输出(使用前面的示例)是
word W'Ord Wo'Rd我尝试了一个简单的模式
s.replaceAll("(\\w)(\\w*)'(\\w)", "$1");但我无法将组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();
回答:
您需要使用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单词边界能够识别Unicode
的内联修饰符。
以上是 Java用大写字母在特定字符前后(前后)替换字符 的全部内容, 来源链接: utcz.com/qa/407264.html

