【问题标题】:Including separator characters in split (javascript)在拆分中包含分隔符(javascript)
【发布时间】:2012-06-23 00:53:01
【问题描述】:

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

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

我遇到的问题是数组项值中不存在分隔符。这就是 sentences 返回的内容:

["First sentence", "Second sentence", "Third sentence", "Fourth sentence", "Fifth sentence"]

应该是:

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

额外注意事项:

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

有什么想法吗?欢迎任何方法(不一定是 split()) - 谢谢

【问题讨论】:

    标签: javascript jquery split


    【解决方案1】:
    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"]
    

    【讨论】:

    • 我真的很喜欢您的解决方案,因为它返回修剪后的值。然而,在测试过程中,我发现了两个额外的考虑因素。我试图自己实施解决方案但没有成功。你能帮我个忙吗?帖子描述已在上面进行了更新,并添加了额外的注意事项。谢谢!
    • 谢谢,解决了第二个考虑,第一个仍然不起作用:最后一句话不需要分隔符(它可以以任何字符结尾)/这很重要,因为对于我的表单的性质,用户通常不关心最后一句话的结束。
    • @andufo 等等,你想让最后一句需要空格吗?我不认为用户在最后一句话之后写了一个空格?
    • 不,我的意思是最后一个用户可以有任何已经提到的分隔符(?!.\n 等)或者也可以有 -nothing- 例如,这个字符串应该返回 2 个句子: “第一句。第二句”(末尾没有多余的空格,但也没有分隔符)——这当然只适用于最后一句。
    • @andufo 啊我想我现在明白了,我再次相应地编辑了正则表达式和示例(最后一句停止,没有任何分隔符)
    【解决方案2】:

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

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

    http://jsfiddle.net/kEHhA/3/

    【讨论】:

    • 末尾的\s 使得这需要在第四句之后有一个空格
    • 此解决方案有效,但无法在句子中丢弃像 13.1.2 这样的节号。它将这样的内容计为 2 个额外的句子。知道如何解决这个问题吗?
    • @W.M.在这种情况下,您可以检查标点符号后是否有空格 (\s) 字符。
    【解决方案3】:

    这对您的目的有用吗?看起来您已经在使用 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(),因此不需要删除数组中奇数元素的第二步。

    【讨论】:

      【解决方案4】:

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

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

      类似:

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

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

      【讨论】:

        【解决方案5】:

        怎么样

        var sentences = $('#text').val().split(/\r\n|\r|\n|\s/gi);
        

        【讨论】:

        • 返回["First", "sentence.", "Second", "sentence?", "Third", "sentence!", "Fourth", "sentence."]
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多