2015-11-01 115 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 

和下一部分的時期和空間 - 僅此而已。將加號改爲星號不會改變此行爲。在字符串內部,所有的句子結尾字符都會匹配,並且最後沒有什麼可以匹配 - 這與*有效。