2013-12-18 73 views
1

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

"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]); 
    } 
} 

有没有更简单的方法来做到这一点?

+0

上面的代码是否工作? –

+0

是的,它给出了输出,但我正在寻找一个简单的想法。 – Lijo

+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] - 小写字符

+0

非常感谢你 – Lijo

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(); 
+0

'\ i'没有在java中 – rzymek

+0

一个有效的正则表达式改成了一个点,感谢察觉这 –

+0

另外,如果'part'是空('输入=“.. X”'),然后'StringIndexOutOfBoundsException'被抛出。 – rzymek

1

NO办法做到这一点既容易并妥善处理。确定一个句子开始或结束的地方非常棘手,并且存在许多微妙的问题。例如,并非所有的时期都结束句子;有些可用于缩写或数字。在这些情况下,需要一些复杂的语言模型来进行合理的猜测。

此外,并不总是肯定句子应该以大写字母开头。例如,我似乎记得,沿着“von xxx”的句子开头的句子不应该被大写,等等。

tl; dr:你可以简单的做法,让它做很多的错误,或者你可以做到这一点非常困难,并且可以在大多数情况下工作,但可能不是所有情况。

1

大多数人会告诉你在一段时间内分裂,把你的文字切成句子。它将为正确的输入,但你的第一个“先生”,“博士”。或“等”。将导致整个事情失败可怕。

既然你提到的语法,你需要成为计算机语法的参与者。看看BNF并创建一些上下文敏感的尝试来建模英语。然后,当你对令牌和产品有个好主意时,从一个简单的词典开始,它用可能的词类标注每一段文本(例如“根”可以是名词和动词,具体取决于)。

如果你精通编程,那么我在像JavaCC这样的“编译器 - 编译器”方面取得了一些体面的成功;但是,有一条学习曲线。如果你想去分析器 - 组合器路由,你可能想要使用像JParsec这样的东西,这似乎是块上当前的“新事物”。

使用这些元素,您将开始获得结果;但是,不要指望你的结果会很棒。这是其他人在事业上的一个大项目。然而,至少你会得到正确的结果(并在这个过程中学到很多东西)。始终偏爱方便;因为代码具有超出简单需求的趋势,并且正确添加是一件非常艰巨的任务。

+0

。 – Lijo

+0

@ 404 http:// en。 wikipedia.org/wiki/Backus%E2%80%93Naur_Form https://javacc.java.net/ http://en.wikipedia.org/wiki/Abstract_syntax_tree http://nltk.org/book/ch08.html http ://en.wikipedia.org/wiki/Sentence_diagram http://en.wikipedia.org/wiki/Parse_tree等。这真的是一个清单,为了让它真正适用于所有事情,它是最值得拨款的尖端研究。 –

相关问题