如何将每个句子的第一个字母转换为大写,将所有其他字母转换为小写?

时间:2013-12-18 12:20:43

标签: java string

我的项目中的部分语法检查。 我有一个段落,我想将每个句子的所有首字母都改为大写。 句子中的所有其他字母必须小写。

"lijo was very intelligent.but his Character was not Good.He Played FootBall .
he is veryClever,and wise."

output

"Lijo was very intelligent.But his character was not good.He played football .
He is veryclever,and wise."

我做了以上这样的事情:

public static void main(String[] args) {
    String org= "lijo was very 'intelligent . but his Character was not Good.He Played    FootBall .he is veryClever,and wise.";
    String [] temp=org.split("\\.");
    int len=temp.length;
    String ne = ".";
    for(int i=0;i<len;i++)
    {
        temp[i]=temp[i].toUpperCase();
        temp[i]=(temp[i].substring(0, 1)).toUpperCase()+(temp[i].substring(1, temp[i].length())).toLowerCase();
        System.out.println(temp[i]); 
    }
}

有没有更简单的方法呢?

4 个答案:

答案 0 :(得分:1)

你可以这样做:

private static final Pattern SENTENCE_START = Pattern.compile("(?:^|[.]\\s*)([a-z])");
private String sentenceCase(String org) {
    char[] chars = org.toCharArray();
    Matcher m = SENTENCE_START.matcher(org);
    while (m.find()) {
        chars[m.start(1)] = Character.toUpperCase(chars[m.start(1)]);
    }
    return new String(chars);
}

正则表达式解释:

(?:^|[.]\s*)([a-z])

Regular expression visualization

(?: ) - 未命名群组
^ - 字符串的开头
| - 或
[.] - .字符
\s* - 零个或多个空格
[a-z] - 小写字符

答案 1 :(得分:1)

NO 方法可以轻松妥善地完成此任务。确定句子的开始或结束位置非常棘手,并且存在许多微妙的问题。例如,并非所有句号都结束句子;一些可用于缩写或数字。在这些情况下,需要一个稍微复杂的语言模型才能进行合理的猜测。

此外,并不总是确定句子应该以资本开头。例如,我似乎记得以“von xxx”为首的以姓氏开头的句子不应该大写等等。

tl;博士:你可以通过简单的方式做到并且犯了很多错误,或者你可以用非常困难的方式做到这一点,让它在大多数情况下工作,但可能并非所有情况都适用。

答案 2 :(得分:1)

大多数人会告诉你分开一段时间,将文字分成句子。它适用于正确的输入,但你的第一个“先生”,“博士”。或“et.al.”会导致整件事情失败。

既然你提到了语法,你需要熟悉计算机语法。查看BNF并创建一些上下文敏感的尝试来模拟英语。然后,当你对令牌与制作有一个很好的想法时,从一个简单的字典开始,用它的可能的词性标记每一段文本(例如“root”可以是名词和动词,取决于)。

如果你精通编程,那么我在JavaCC等“编译器编译器”方面取得了不错的成功。然而,有一个学习曲线。如果你想使用解析器 - 组合器路径,你可能想要使用像JParsec这样的东西,这似乎是块上当前的“新东西”。

有了这些元素,你就会开始得到结果;但是,不要指望你的结果那么棒。这是一个很大的项目,其他人已经开始他们的职业生涯。但是,至少你会得到正确的结果(并在此过程中学到很多东西)。总是偏向于方便;因为代码有一种比简单要求更长的倾向,并且添加正确性确实是一项非常艰巨的任务。

答案 3 :(得分:0)

也许是这样的:

StringBuilder resultBuilder = new StringBuilder();
String[] parts = input.split("\\.");
for(String part : parts){
   resultBuilder.append(part.substring(0,1).toUppercase())
                .append(part.substring(1).toLowercase())
                .append(".");
}
return resultBuilder.toString();