3

这是一个文本区域。用户可以写任何东西。

<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() ) -谢谢

4

5 回答 5

8

改为使用.match文档)。当您将它与/.../g-type 正则表达式一起使用时,它会返回一个包含所有匹配项的数组。您只需要先修改您的正则表达式:

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

​<a href="http://jsfiddle.net/kEHhA/3/" rel="nofollow">http://jsfiddle.net/kEHhA/3/

于 2012-06-20T20:03:18.730 回答
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"]
于 2012-06-20T20:02:42.830 回答
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(),因此不需要删除数组中奇数元素的第二步。

于 2012-06-20T20:10:36.843 回答
0

关于什么

var sentences = $('#text').val().split(/\r\n|\r|\n|\s/gi);
于 2012-06-20T19:54:54.353 回答
0

使用look-behinds会很容易,但由于 JavaScript 不支持它,我的建议是:

找到要拆分的空白字符,然后用一些虚拟字符替换它们。然后在那个角色上分裂。

就像是:

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

编辑:显然有更好的解决方案不依赖拆分。但是,我将把它作为替代方案。

于 2012-06-20T20:02:34.103 回答