2011-06-13 217 views
0

什麼是Java實現句首字母大寫轉換與Java

例如句首字母大寫轉換的最佳途徑:今天 是星期一。昨天是星期天。星期二來到星期一後

輸出將是 T今天是星期一。 Y esterday是星期日。 牛逼 uesday來後周一

我的邏輯是:

  • 轉換全句爲小寫字母。

  • 檢查'.'和轉換的第一個字符以大寫字母后'. '

+3

聽起來理智,假設你的句子不包含名稱或縮寫詞 – 2011-06-13 11:11:49

+0

這實在是一個算法的問題,而不是Java的問題;這個方法就是你所要求的,並且實現是一個小細節 – 2011-06-13 11:16:03

+4

我希望你會在例子中使用週五而不是星期一。然後我們可以製作Rebecka黑色笑話。 – 2011-06-13 11:18:44

回答

3

你的邏輯看起來很好。多一點代碼:

  • sentence.split("[\\.?!]")會給你的句子組成的數組(分裂的標點符號
  • 包括特殊情況下,像5分鐘的縮寫
  • 沒有轉換爲小寫 - 你可能會失去的。專名
  • 的資本
  • 將每個句子的第一個字母爲大寫(修剪之前,任何空格)
+0

這可能不適用於非英語語言/腳本,這是此答案的嚴重限制。不幸的是,我不知道一種適用於所有語言的解決方案,但缺少像ICU4J這樣的庫。無論如何,你可能應該這樣做,而不是試圖重新實現這一點,並使許多情況錯誤。 – 2014-08-28 11:43:10

1

除了像例如縮寫或3磅的重量 - 這些會讓你陷入困境,並且沒有一種很好的方法來自動檢測句子的開始。 (注意:縮寫也可以是專有名稱,如紐約的N.Y.,因此沒有詳盡的列表)

您還需要使用?和!作爲句子分隔符。

0

StringCharacterIterator。您迭代,直到找到一個點(或其他分隔符),然後查找下一個字母(可能是一些空格/換行符,直到找到它)並使其成爲大寫。

1

這裏有一個解決方案爲您:

String input = "today is monday. yesterday was sunday. tuesday comes after monday"; 
StringBuffer buffy = new StringBuffer(input); // You may want to .toLowerCase() - up to you 
Pattern pattern = Pattern.compile("(^|\\.)\\s*(\\w)"); 
Matcher matcher = pattern.matcher(buffy); 
while (matcher.find()) 
    buffy.replace(matcher.end() - 1, matcher.end(), matcher.group(2).toUpperCase()); 
System.out.println(buffy); // Today is monday. Yesterday was sunday. Tuesday comes after monday 

的正則表達式上線或點的任一開始(^|\\.)\\s*(\\w)匹配,其次是可選的空格,最後一個字字符。

+0

如果需要,可以在第一組正則表達式中添加額外的標點符號(!,?),並且可以添加「toLowerCase()」。 – Kru 2011-06-13 11:51:54

0

另一種解決方案:

StringBuilder txt = new StringBuilder("today is monday. yetserday was sunday. tuesday comes after monday"); 
int pos = -1; 
do 
{ 
    txt.replace(pos + 1, pos + 2, txt.substring(pos + 1,pos + 2).toUpperCase()); 
    pos = txt.indexOf(".", pos) + 1; 
} 
while(pos > 0 && pos < txt.length()); 
System.out.println(txt.toString()); 

OUTPUT:

Today is monday. Yetserday was sunday. Tuesday comes after monday 
+0

如果輸入字符串爲空 - 會不會拋出異常? – 2011-06-13 11:49:36