[英]Java: How to capitalize the first character of each word in a string, and correctly capitalize names
我正在尋找執行以下操作的 Java 方法:
每個單詞的字母大寫: "a great string" -> "A Great String"
名稱的撇號后字母大寫: "rick o'shea" -> "Rick O'Shea"
所有格添加的“s”不受影響: "a bug's life" -> "A Bug's Life"
我嘗試了諸如WordUtils.capitalize
類的方法,但大多數都不能滿足 2,而其他的不能滿足 3。
有沒有一種可以同時滿足這三個方面的有效方法?
編輯:更多情況下撇號后的字母不應大寫
不過對於這個問題,我們可以專注於's
。
當您在庫中找不到它時,您可以編寫自己的方法。 這是使用正則表達式的解決方案:
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());
}
試試這個,我只拿了你提出的測試用例,所以你可能想添加進去:
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);
}
Output:
A Great String
Rick O'Shea
A Bug's Life
如果有方法可以解決除 3 之外的所有問題,您可以使用它們並添加代碼來扭轉他們做錯的任何事情。 一旦大寫,我們只需替換“Bug'S Life”中的“'S”
請注意,如果您以所有格結尾,則需要在 String 的末尾臨時添加一個空格,您應該詢問語言 stackexchanges 盡管您是否可以用所有格結束文本: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 ");
如果有任何其他類似的情況,大多數應該能夠以同樣的方式解決,也應該保持你的代碼相當干凈
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.