【问题标题】:Regex that splits long text in separate sentences with match()使用 match() 将长文本拆分为单独句子的正则表达式
【发布时间】:2012-06-23 02:00:16
【问题描述】:

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

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

Fifth sentence
</textarea>

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

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

缺少要求(我需要帮助)

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

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

有什么想法吗?谢谢!

【问题讨论】:

    标签: javascript jquery regex pattern-matching match


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗨,谢谢!我用几个场景测试它,但它总是在数组的最后一个位置返回一个不必要的空数组项。出于某种原因,它也将 \t(制表符)作为新行。
    • $ 更改为 \n 应该可以解决它。我真的不知道为什么我首先选择使用$
    • 嗨,我刚刚注意到您的正则表达式不涵盖第三个要求(它以前在我的正则表达式中涵盖)。有什么想法吗?
    • 我修好了,在[.!?]后面加一个加号
    • arghhh 抱歉,我正在测试其他方法,但没有得到我想要的响应。最后一个提示效果很好:)
    【解决方案2】:

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

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

    让我们分解一下:

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

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

    您声明要保留此标点符号,因此匹配 [.\?!] 之后的下一部分是包含这些相同标点符号的系列,因此它们包含在外部分隔符中。编辑:我为此添加了星号以包含任意数量的标点符号,或者在句尾根本不包含任何标点符号。

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

    【讨论】:

    • 嗨,实际上正则表达式不会将 \n 转换为空数组项,现在列出的第三个要求根本不起作用:s
    • 我为此添加了星号以包含任意数量的标点符号,或者在句尾根本不包含任何标点符号。
    猜你喜欢
    • 2016-08-04
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2016-04-25
    相关资源
    最近更新 更多