2015-11-01 110 views
2

我试图将一个字符串拆分为“句子”,但我遇到了一个跟踪单词的问题。例如:正则表达式句子拆分

"This isn't cool. This doesn't work. This"

应该分成

[This is cool., This doesn't work., This]

到目前为止,我一直在使用"[^\\.!?]*[\\.\\s!?]+"但无法弄清楚如何调整这个拖尾字,因为没有终止字符,因此没有什么可寻找的。有什么我可以添加或我需要完全调整它?

+0

我在手机上,不能测试这个,但是你应该尝试添加字符串元字符'$'的结尾到你的第二系列字符。 – brittenb

+0

我不会投票关闭它作为[将字符串拆分成基于句点的句子]的副本(http://stackoverflow.com/questions/2687012/split-string-into-sentences-based-on-periods),因为您的标题明确指出你想使用正则表达式,但考虑使用其他工具来描述所描述的问题。 – Pshemo

回答

1

而是分裂字符串中,你可以找到所有的句子匹配尾随句话你可以使用锚$将字符串的结尾匹配和:

List<String> sentences = new ArrayList<String>(); 
Matcher m = Pattern.compile("[^?!.]+(?:[.?!]|$)") 
    .matcher("This isn't cool. This doesn't work. This"); 
while (m.find()) { 
    sentences.add(m.group()); 
} 
2
String s = "This isn't cool. This doesn't work. This"; 
System.out.println(Arrays.toString(s.split("\\. "))); 

产地:

[This isn't cool, This doesn't work, This] 
0

您也可以安全地将最后的+更改为*

正则表达式默认为贪婪,每个单独的部分将抓取尽可能多的数据。这意味着第一个子表达式将匹配

This isn't cool 

和下一部分的时期和空间 - 仅此而已。将加号改为星号不会改变此行为。在字符串内部,所有的句子结尾字符都会匹配,并且最后没有什么可以匹配 - 这与*有效。