正则表达式使用 match() 将长文本拆分为单独的句子

Regex that splits long text in separate sentences with match()

本文关键字:拆分 文本 单独 句子 match 正则表达式      更新时间:2023-09-26

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

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

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

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

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

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

["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 正则表达式测试器查看匹配的组。