我有以下输入字符串
Lorem ipsum dolor sat amet consectetur adipiscing elit sed doeiusmod 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);
UPDATE
边界条件:如果最后一个单词/单词不匹配任何规则,则只需将它们添加为最后一个数组元素(但一个字符串中两个长单词不能更新)
总结和有趣的结论
对于这个问题,我们得到了 8 个很好的答案,其中一些讨论了自描述(或自解释)代码。自描述代码是指没有阅读问题的人在第一次查看后能够轻松说出代码到底做了什么。可悲的是,任何一个答案都提供了这样的代码 - 所以这个问题是一个例子,它表明自我描述可能是一个神话
您可以将规则表达为缩写的正则表达式,从中构建真正的正则表达式并将其应用到您的输入:
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))
如果规则不改变,则正则表达式构造部分只需要一次。
请注意,这也以合理的方式处理标点符号。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)