首页 > 解决方案 > Javascript,将字符串剪短,但仅限于特定位置

问题描述

假设我有一个长字符串,每个部分都遵循这种格式:<@some numbers> 而且我还有一个字符限制。我希望它仅在空格处剪切字符串,但将其设置在我设置的字符限制之下。

示例输入:

Input: <@756307474931515432> <@123891849950781999> <@935718581892734987> <@589058297589273488>
Character Limit: 54

不要在第 54 个字符处将其剪切,而是在中间的空间剪切它。

Incorrect: <@756307474931515432> <@123891849950781999> <@93571858
Correct: <@756307474931515432> <@123891849950781999>

实现我想要的可能性是将字符串拆分为每个空格( ),然后循环遍历,如果它低于字符限制,则仅附加下一部分。

有没有更简单的方法,比如我不知道的函数,或者我上面所说的会是最好的方法吗?

这也是在javascript中。

标签: javascriptnode.jsstring

解决方案


更新

由于您知道每个块的最后一个字符将始终相同并且不会出现在块的其他位置,因此您可以通过简单地检查剪切字符串是否以该字符结尾来解决此问题而无需循环。如果它没有然后拆分为一个数组,请删除最后一个元素并重新加入剩余的元素以返回正确剪切的字符串。

let trimmed = src.substring(0,limit).trimEnd();

trimmed = trimmed.endsWith('>') ? trimmed : trimmed.split(' ').slice(0, -1).join(' ');

const src = '<@756307474931515432> <@123891849950781999> <@935718581892734987> <@589058297589273488>';

const limit = 54;

// Cut string to desired length and trim white space in case 
// it cut right after a space
let trimmed = src.substring(0,limit).trimEnd();

// If the string ends with '>' then you are done
// else split the string, slice off the last element, and rejoin
trimmed = trimmed.endsWith('>') ? trimmed : trimmed.split(' ').slice(0, -1).join(' ');

console.log(trimmed);

如果每个块的最后一个字符未知或与块的其余部分没有区别,您将需要对从字符串生成的数组或字符串本身使用迭代。

循环解决方案

拆分和循环/减少似乎很简单。但是为了避免循环不必要的组超出限制,您可以substring()先调用。

const limit = 54;
const trimmed = src.substring(0,limit);

由于这会返回一个正好是限制长度的字符串,因此需要您<在 reduce 函数中使用而不是 '<=' 以避免它重建并返回整个错误切割的字符串。如果组加起来恰好达到限制,则使用<宁可考虑重新添加的空间。<=

const src = '<@756307474931515432> <@123891849950781999> <@935718581892734987> <@589058297589273488>';

const limit = 54;

const trimmed = src.substring(0,limit).split(' ').reduce((acc, s) => { 
  if (acc.length + s.length < limit) return acc + ' ' + s;
  return acc;
  }, '');

console.log(trimmed);

另一个奇怪的解决方案是找到限制之前最后一个空间的索引使用indexOf

const input = '<@756307474931515432> <@123891849950781999> <@935718581892734987> <@589058297589273488>';
const limit = 54;

let cut;
let i = -1;
while (i <= limit) {
  i = input.indexOf(' ', i+1);
  if (i <= limit) cut = i;
};

const output = input.substring(0, cut);
console.log(output);


推荐阅读