我想按句子截断文本。
示例文本:'Lorem ipsum dolor amet,礼貌地拥护精英! Ut vehicula laoreet urna,commodo vulputate massaluctus。Sedvolutpat nunc vita urna auctor,在tempus enim rhoncus。 Arcu Mattis Commodo的Morbi AC Tortor?莫尔比(Orbire arcu),射手座摄食性天体病。 Aenean lobortis lacinia nisl,nec laoreet ipsum viverra ac。 Praesent venenatis eleifend risus et pulvinar。天然的紫苏。 Nulla facilisi。”
到目前为止,这就是我所拥有的:
const truncate = (text: string, limit: number) => {
const reduced = text
.split(/[?!\.]/)
.reduce((acc, cur) => {
acc = (acc + cur).length < limit? `${acc}. ${cur}` : acc;
return acc;
});
return reduced.length > limit? reduced.slice(limit - 3) + '...' : reduced;
};
console.log(truncate(text, 300));
问题在于,总是将点放在而不是实际的标点符号之前,有时甚至将点放在最后。这里有几个例子:
限制:50
1个句子的长度为24 // 24
2个句子的长度为20 // 44 3句长度为24 // 68
另外我的代码没有用标点符号说明句子的长度,但是我想我可以只添加
1
。编辑:
上限:70
输出:“Lorem ipsum dolor坐在amet,私服adipiscing精英!”
限制:40
输出:“Lorem ipsum dolor坐在amet,conesectet ...”
上限:220
输出:“Lorem ipsum dolor坐在amet,保密的精英,sed,eiusmod tempor incididunt ut Labore et dolore magna aliqua吗?”
上限:240
输出:“Lorem ipsum dolor坐满了,奉献了上流社会,sed do eiusmod tempor incididunt ut labour et dolore magna aliqua吗?
最佳答案
编辑:这怎么办
const string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua? Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
const truncate = (text, limit) => {
let reduced = text
.match(/[^\.!\?]+[\.!\?]+/g)
.reduce((acc, cur) => {
acc = (acc + cur).length < limit ? acc + cur : acc;
return acc;
});
if (text.match(/[^\.!\?]+[\.!\?]+/g)[0].length > limit) reduced = reduced.slice(0, limit - 3) + "...";
return reduced;
};
console.log(truncate(string, 240));