这是一个textarea。用户可以写任何东西。
<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"]
额外考虑因素:
有什么想法吗?任何方法都是受欢迎的(不一定是split()) - 谢谢!
答案 0 :(得分:8)
改为使用.match
(docs)。当您使用/.../g
- 类型的正则表达式时,它会返回所有匹配项的数组。您只需要先修改正则表达式:
var sentences = $('#text').val().match(/[^\r\n.!?]+(\r\n|\r|\n|[.!?])\s*/gi);
答案 1 :(得分: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"]
答案 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的解决方案类似但更优雅,使用match()而不是split(),因此不需要删除数组中奇数元素的第二步。
答案 3 :(得分:0)
怎么样
var sentences = $('#text').val().split(/\r\n|\r|\n|\s/gi);
答案 4 :(得分:0)
使用look-behinds会很容易,但由于JavaScript不支持,我的建议是:
找到要拆分的空格字符,并用一些虚拟字符替换它们。然后拆分那个角色。
类似的东西:
$('#text').val().replace(/\r\n|\r|\n|([.!?])\s/gi, '$1\0').split(/\0/g);
编辑:显然有更好的解决方案不依赖于拆分。不过我会留下这个替代方案。