使用match()在单独的句子中分割长文本的正则表达式

这是一个textarea,用户在其中写入一些文本。 我在里面写了一个例子。

 

正则表达式中已经考虑过的要求

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

缺少要求(我需要帮助)<<

每个新行应该由一个空数组项表示。 如果应用正则表达式,则应该是响应:

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

相反,我收到了这个:

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

这是正则表达式和匹配调用:

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

有任何想法吗? 谢谢!

我简化了很多,要么匹配一行(新行)或一个句子后跟标点符号:

 var tregex = /\n|([^\r\n.!?]+([.!?]+|$))/gim; 

我也相信多线的m标志很重要

您可以使用以下正则表达式:

 /((?:\S[^\.\?\!]*)[\.\?\!]*)/g 

让我们打破这个:

g ”表示全局匹配的标志,表示在第一次出现后保持匹配

从内到外, (?:)是一个分隔符,允许我们对表达式进行分组,但丢弃输出中的匹配结果。 我们匹配不包含句点,问号或感叹号的\ S (非空格)。

你声明你想要保留这个标点符号,所以匹配后的下一部分[。\?!]是一个包含这些相同标点符号的系列,因此它们包含在外部分隔符中。 编辑:我为此添加了星号,以包括任何数量的标点符号,或句子末尾没有标点符号。

使用http://www.pagecolumn.com/tool/regtest.htm或类似的Javascript正则表达式测试程序查看匹配的组。