在split(javascript)中包含分隔符

时间:2012-06-20 19:51:47

标签: javascript jquery split

这是一个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"]

额外考虑因素:

  • 最后一句不需要分隔符(它可以以任何字符结尾)
  • 如果一个句子有多个分隔符char,它也应该包含在数组项中。例如:第二句?? 应该是[...,“第二句话??”,...]

有什么想法吗?任何方法都是受欢迎的(不一定是split()) - 谢谢

5 个答案:

答案 0 :(得分:8)

改为使用.matchdocs)。当您使用/.../g - 类型的正则表达式时,它会返回所有匹配项的数组。您只需要先修改正则表达式:

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

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

答案 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);​​​​​

编辑:显然有更好的解决方案不依赖于拆分。不过我会留下这个替代方案。