0

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

<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);

有任何想法吗?谢谢!

4

2 回答 2

2

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

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

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

于 2012-06-23T02:07:09.703 回答
1

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

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

让我们分解一下:

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

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

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

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

于 2012-06-23T02:26:44.567 回答