Javascript 在最多X个字后拆分文本

Javascript 在最多X个字后拆分文本,javascript,regex,Javascript,Regex,我努力想找到解决问题的办法,尽管能和大家分享会很好。问题是: 我有一个文本,它可能包括任何类型的标点符号。我想把它分成两部分: 最多X个字 包括附加在最后一个单词上的点状标记,如点或逗号 课文的结尾 从两部分之间的间距开始 以下是一些例子: str = "one two, three, quatro 5! : six sept ocho nine 10!" splitAfterXWords(str, 2) // ["one two,", "three, quatro 5! : six

我努力想找到解决问题的办法,尽管能和大家分享会很好。问题是:

我有一个文本,它可能包括任何类型的标点符号。我想把它分成两部分:

  • 最多X个字
    • 包括附加在最后一个单词上的点状标记,如点或逗号
  • 课文的结尾
    • 从两部分之间的间距开始
  • 以下是一些例子:

    str = "one two, three, quatro 5! : six sept  ocho nine 10!"
    
    splitAfterXWords(str, 2)
    // ["one two,", "three, quatro 5! : six sept  ocho nine 10!"]
    
    splitAfterXWords(str, 5)
    // ["one two, three, quatro 5!", " : six sept  ocho nine 10!"]
    
    splitAfterXWords(str, 20)
    // ["one two, three, quatro 5! : six sept  ocho nine 10!", ""]
    
    splitAfterXWords(str, 6)
    // ["one two, three, quatro 5! : six", " sept  ocho nine 10!"]
    

    下面是一个执行此操作的函数:

    function splitAfterXWords(to_split, words){
        regex = new RegExp("(([\\s;:!,.?\"'’]*[^\\s]+){" + words + "})(.*)")
        result = regex.exec(to_split)
        return result ? [result[1], to_split.substr(result[1].length)] : [to_split, '']
    }
    
    你可以看到它正在工作


    欢迎改进和评论

    以下是我从给定句子中获取
    n
    单词的尝试:

    var regexp = /\s*\S+\/;
    function truncateToNWords(s, n) {
       var l=0;
       if (s == null || n<= 0) return l;
       for (var i=0; i<n && (match = regexp.exec(s)) != null; i++) {
          s = s.substring(match[0].length);
          l += match[0].length;
       }
       return l;
    }
    
    // your sentence
    var s = "one two, three, quatro 5!: six sept  ocho nine 10!";
    
    l = truncateToNWords(s, 2);
    console.log([s.substring(0, l), s.substring(l)]);
    
    l = truncateToNWords(s, 5);
    console.log([s.substring(0, l), s.substring(l)]);
    
    l = truncateToNWords(s, 6);
    console.log([s.substring(0, l), s.substring(l)]);
    
    l = truncateToNWords(s, 20);
    console.log([s.substring(0, l), s.substring(l)]);
    

    您是否考虑过使用
    \b
    来检测单词边界而不是标点符号的白名单?我想了一下,但没有想到在这种情况下如何使用它。你知道吗?我最近不得不修改代码。这根本不具有伸缩性。在20个单词后拆分就像一个charme,但令人惊讶的是,100个单词会使当前选项卡崩溃。我不知道为什么。不错,只是输出有一点不同。第一部分包含最后一个单词后面的空格:
    一两,
    应该是没有空格的
    一两,
    。我想您可以切换regexp的两个术语:
    /\s*\s+/
    ["one two,", " three, quatro 5!: six sept ocho nine 10!"]
    ["one two, three, quatro 5!:", " six sept ocho nine 10!"]
    ["one two, three, quatro 5!: six", " sept ocho nine 10!"]
    ["one two, three, quatro 5!: six sept ocho nine 10!", ""]