Java:如何将字符串中每个单词的第一个字符大写,并正确地将名称大写
我正在寻找一种Java方法,它可以执行以下操作:Java:如何将字符串中每个单词的第一个字符大写,并正确地将名称大写,java,string,capitalization,capitalize,Java,String,Capitalization,Capitalize,我正在寻找一种Java方法,它可以执行以下操作: 每个单词的字母都大写:“一个伟大的字符串”->“一个伟大的字符串” 名字的字母后面有一个大写撇号:“rick o'shea”->“rick o'shea” 为所有格添加的“s”不受影响:“一个bug的生活”->“一个bug的生活” 我尝试了一些方法,比如WordUtils.capitalize,但大多数都不满足2,其他的都不满足3 有没有一种有效的方法可以满足这三个条件 编辑:更多情况下,撇号后的字母不应大写 的 “好的 “不 “d “我 “是
“一个伟大的字符串”->“一个伟大的字符串”
“rick o'shea”->“rick o'shea”
“一个bug的生活”->“一个bug的生活”
WordUtils.capitalize
,但大多数都不满足2,其他的都不满足3
有没有一种有效的方法可以满足这三个条件
编辑:更多情况下,撇号后的字母不应大写
- 的
- “好的
- “不
- “d
- “我
- “是吗
然而,对于这个问题,我们可以集中讨论
的
试试这个,我只接受了您介绍的测试用例,所以您可能希望添加到其中:
public static void main(String[] args) {
System.out.println(capitalize("a great string"));
System.out.println(capitalize("rick o'shea"));
System.out.println(capitalize("a bug's life"));
}
private static String capitalize(String str) {
StringBuilder sb = new StringBuilder();
for(String s : str.split(" ")) {
if(Character.isLowerCase(s.charAt(0)))
s = (char)(s.charAt(0)-32) + s.substring(1);
int index = s.indexOf("'");
if(index > -1 && (s.length() - index) > 2) {
s = s.substring(0,index+1) + (char)(s.charAt(index+1)-32) + s.substring(index+2);
}
sb.append(s+" ");
}
String res = sb.toString();
return res.substring(0, res.length()-1);
}
输出:
A Great String
Rick O'Shea
A Bug's Life
如果有方法可以解决除3之外的所有问题,那么您可以使用它们并添加代码来逆转它们所做的任何错误。 我们只要在“Bug'S Life”中大写“'S”就可以了 请注意,如果以所有格结尾,则需要在字符串末尾临时添加一个空格,但如果可以以所有格结尾,则应询问语言:D 例如,简单的方法是
String almost ="rick o'shea a bug's life".satisfy2();
//At this point you have "Rick O'Shea A Bug'S Life"
//Replacing possessive with small s (Notice the space here, so O'Shea won't be touched)
String finished = almost.replace("'S ","'s ");
如果还有其他类似的情况,大多数情况下都应该能够以相同的方式解决,还应该保持代码非常干净当在libs中找不到方法时,可以编写自己的方法。下面是一个使用正则表达式的解决方案:
String capitalize(String s) {
Matcher m = Pattern.compile("(\\w)(\\w*)").matcher(s);
s = m.replaceAll(mr -> mr.group(1).toUpperCase() + mr.group(2).toLowerCase());
m = Pattern.compile("'\\w\\b").matcher(s);
return m.replaceAll(mr -> mr.group(0).toLowerCase());
}
据我所知,我不知道这样的图书馆。对于您的特殊需要,您需要提供一个名称+姓氏和模式匹配输入单词的词典。java如何知道大写哪个词呢?这可以由100行以下的自定义字符串实用程序classIs O'Shea处理,这是您希望看到的唯一“边缘大小写”?如果是这样,您可以显式地处理它。否则,请阅读。为什么您不能编写自己的方法?我忽略了这一点,很多名字都不遵循这些模式。例如,“Charles de Lint.”这可能会导致
s
字母从大写变为非大写。O'Shea将保留O'Shea,因为替换会在Bug之后有空格时替换,或者Bug的会导致Bug的,因为之后有空格