2012-06-20 110 views
3

這是一個textarea。用戶可以寫任何東西。在split中包含分隔符(javascript)

<textarea id="text">First sentence. Second sentence? Third sentence! 
Fourth sentence. 

Fifth sentence 
</textarea> 

最後,我必須將所有的文本拆分成一個數組。

var sentences = $('#text').val().split(/\r\n|\r|\n|[.|!|?]\s/gi); 

我遇到的問題是分隔符字符不在數組項值中。這是句子將返回:

["First sentence", "Second sentence", "Third sentence", "Fourth sentence", "Fifth sentence"] 

它應該是:

["First sentence.", "Second sentence?", "Third sentence!", "", "Fourth sentence.", "", "", "Fifth sentence"] 

額外的考慮:

  • 最後一句不需要分隔符(它可以結束任何字符)
  • 如果一個句子有多個分隔字符,它也應該包含在它的數組中EM。例如:第二句??應該是[...,「第二句??」,...]

任何想法?任何方法是歡迎的(不是分割()必然) - 謝謝

回答

3
var re = /[^\r\n.!?]+(:?(:?\r\n|[\r\n]|[.!?])+|$)/gi; 
("First sentence.. Second sentence?? Third sentence!!\n"+ "Fourth sentence").match(re).map($.trim) 
//["First sentence..", "Second sentence??", "Third sentence!!", "Fourth sentence"] 
+0

我真的很喜歡你的解決方案,因爲它會返回修剪後的值,但是在測試過程中我發現了兩個額外的考慮因素,我試圖自己實現解決方案沒有成功,你能給我一個手嗎?後面的描述已經更新上面的額外注意事項。謝謝! – andufo

+0

@andufo我編輯了正則表達式和示例相應 – Esailija

+0

謝謝,固定第二個考慮,第一個仍然不工作:最後一句不需要分隔符(它可以以任何字符結尾)/這很重要,因爲對於表單的性質,用戶通常不關心最後一句關閉。 – andufo

0

怎麼樣

var sentences = $('#text').val().split(/\r\n|\r|\n|\s/gi); 
+3

返回'[「First」,「句子」,「Second」,「sentence?」,「Third」,「sentence!」,「Fourth」,「句子。「]' –

+0

檢查你的結果http://jsfiddle.net/heera/XCWs6/ –

0

這將是容易look-behinds,但由於JavaScript不支持的話,我的建議是:

找到您想要拆分並取代它們的空白字符與一些虛擬角色。然後分割那個角色。

喜歡的東西:

$('#text').val().replace(/\r\n|\r|\n|([.!?])\s/gi, '$1\0').split(/\0/g);​​​​​ 

編輯:顯然有更好的解決方案不依賴於分裂。不過,我會留下這個替代方案。

8

改爲使用.matchdocs)。當您將它與/.../g-類型的正則表達式結合使用時,它會返回所有匹配的數組。你只需要先修改你的正則表達式:

var sentences = $('#text').val().match(/[^\r\n.!?]+(\r\n|\r|\n|[.!?])\s*/gi); 

http://jsfiddle.net/kEHhA/3/

+0

最後的'\ s'使得這需要一個空格在第四句 – Esailija

+0

之後就這樣了。 http://jsfiddle.net/kEHhA/2/更「修剪」。 – Blazemonger

+0

該解決方案可行,但未能在句子中放棄像「13.1.2」這樣的節號。它將這樣的數字看作2個額外的句子。任何想法如何解決這個問題? –

1

這是否工作,爲你的目的是什麼?它看起來像你已經在使用jQuery的,但如果沒有它應該很容易修改:

var sentences = []; 
$.each($('#text').val().split(/([^\.\?\!\r\n]+.)\s/gi), function(i, sentence) { 
    if(i%2 !== 0) { 
    sentences.push(sentence) 
    } 
}); 
// sentences = ["First sentence.", "Second sentence?", "Third sentence!", "Fourth sentence."] 

編輯:Blazemonger的解決方案是類似的,但更優雅,使用匹配(),而不是分裂(),因此不需要在第二步移除數組中的奇數元素。

相關問題