首页 > 解决方案 > 将字符串拆分为具有 1-3 个单词的字符串数组,具体取决于长度

问题描述

我有以下输入字符串

Lorem ipsum dolor sit amet consectetur adipiscing elit sed doeiu​​smod tempor incididunt ut Duis aute irure dolor in reprehenderit in esse cillum dolor eu fugia ...

通过示例拆分规则

[
     "Lorem ipsum dolor",  // A: Tree words <6 letters  
     "sit amet",           // B: Two words <6 letters if next word >6 letters
     "consectetur",        // C: One word >=6 letters if next word >=6 letters
     "adipiscing elit",    // D: Two words: first >=6, second <6 letters
     "sed doeiusmod",      // E: Two words: firs<6, second >=6 letters
     "tempor"              // rule C
     "incididunt ut"       // rule D
     "Duis aute irure"     // rule A
     "dolor in"            // rule B
     "reprehenderit in"    // rule D
     "esse cillum"         // rule E
     "dolor eu fugia"      // rule D
     ...
]

所以你可以看到数组中的字符串可以有最少一个和最多的树字。我尝试按以下方式进行操作,但不起作用 - 怎么做?

let s="Lorem ipsum dolor sit amet consectetur adipiscing elit sed doeiusmod tempor incididunt ut Duis aute irure dolor in reprehenderit in esse cillum dolor eu fugia";

let a=[""];
s.split(' ').map(w=> {
  let line=a[a.length-1];
  let n= line=="" ? 0 : line.match(/ /g).length // num of words in line
  if(n<3) line+=w+' ';
  n++;
  if(n>=3) a[a.length-1]=line 
}); 

console.log(a);

更新

边界条件:如果最后一个单词/单词不匹配任何规则,那么只需将它们添加为最后一个数组元素(但两个长单词不能在一个字符串中更新)

总结和有趣的结论

对于这个问题,我们得到了 8 个很好的答案,其中一些讨论了自描述(或自解释)代码。自描述代码是当没有阅读问题的人在第一次看后能够轻松说出代码的确切作用时。可悲的是,任何答案都提供了这样的代码 - 所以这个问题是一个例子,表明自我描述可能是一个神话

标签: javascript

解决方案


您可以将规则表达为缩写的正则表达式,从中构建真正的正则表达式并将其应用于您的输入:

text = "Lorem ipsum, dolor. sit amet? consectetur,   adipiscing,  elit! sed doeiusmod tempor incididunt ut Duis aute irure dolor in reprehenderit in esse cillum dolor eu fugia bla?";

rules = ['(SSS)', '(SS(?=L))', '(L(?=L))', '(SL)', '(LS)', '(.+)']

regex = new RegExp(
    rules
        .join('|')
        .replace(/S/g, '\\w{1,5}\\W+')
        .replace(/L/g, '\\w{6,}\\W+')
    , 'g')

console.log(text.match(regex))

如果规则不变,则正则表达式构造部分只需要一次。

请注意,这也以合理的方式处理标点符号。


推荐阅读