如何将字符串拆分为 n 个字符的段?

IT技术 javascript arrays string split
2021-01-16 13:48:44

正如标题所说,我有一个字符串,我想分成n 个字符的

例如:

var str = 'abcdefghijkl';

经过一些魔法n=3,它会变成

var arr = ['abc','def','ghi','jkl'];

有没有办法做到这一点?

6个回答

var str = 'abcdefghijkl';
console.log(str.match(/.{1,3}/g));

注意:使用{1,3}而不仅仅是{3}包含不是 3 倍数的字符串长度的余数,例如:

console.log("abcd".match(/.{1,3}/g)); // ["abc", "d"]


还有一些微妙之处:

  1. 如果您的字符串可能包含换行符(您想将其视为一个字符而不是拆分字符串),则.不会捕获这些。使用/[\s\S]{1,3}/来代替。(感谢@Mike)。
  2. 如果您的字符串为空,则在您可能需要一个空数组时match()返回null通过附加|| [].

所以你可能会得到:

var str = 'abcdef \t\r\nghijkl';
var parts = str.match(/[\s\S]{1,3}/g) || [];
console.log(parts);

console.log(''.match(/[\s\S]{1,3}/g) || []);

您可能希望在每一行上开始一个新的循环。如果您确实有换行符,它们可能表示某种类型的转换。str.match(/.{1,3}/gm) 可能是更好的选择。
2021-03-12 13:48:44
使用[\s\S].不是为了不会在换行符上失败。
2021-03-18 13:48:44
从技术上讲,这是更好的答案,因为它将从不能被 3 整除的字符串中获取所有文本(它将获取最后 2 或 1 个字符)。
2021-03-21 13:48:44
是否有可能在数字 3 的位置有一个变量?
2021-03-24 13:48:44
+1小心: ''.match(/.{1,3}/g)''.match(/.{3}/g)返回null而不是空数组。
2021-03-26 13:48:44

如果您不想使用正则表达式...

var chunks = [];

for (var i = 0, charsLength = str.length; i < charsLength; i += 3) {
    chunks.push(str.substring(i, i + 3));
}

js小提琴

...否则正则表达式解决方案非常好:)

这比 regex 选项快 10 倍以上,所以我会使用这个(在函数内部)jsbench.github.io/#9cb819bf1ce429575f8535a211f72d5a
2021-03-15 13:48:44
要是你能把它包装成一个准备好使用的有用的函数就好了
2021-03-20 13:48:44
+1 cos 如果3OP 建议的变量是可变的,我更喜欢这个它比连接正则表达式字符串更具可读性。
2021-03-21 13:48:44
这在大长度的字符串上是否可持续?
2021-03-21 13:48:44
我之前的声明适用于 Chromium(另外,我编辑之前的评论为时已晚,因此是新评论)。在 Firefox 上,它目前在我的机器上“仅”快 30%,但这仍然始终更好。
2021-03-27 13:48:44
str.match(/.{3}/g); // => ['abc', 'def', 'ghi', 'jkl']
3对我有用null但返回250. 🤔
2021-03-26 13:48:44

建立在之前对这个问题的回答的基础上;以下函数将拆分字符串 ( str) n 个 ( size) 字符。

function chunk(str, size) {
    return str.match(new RegExp('.{1,' + size + '}', 'g'));
}

演示

(function() {
  function chunk(str, size) {
    return str.match(new RegExp('.{1,' + size + '}', 'g'));
  }
  
  var str = 'HELLO WORLD';
  println('Simple binary representation:');
  println(chunk(textToBin(str), 8).join('\n'));
  println('\nNow for something crazy:');
  println(chunk(textToHex(str, 4), 8).map(function(h) { return '0x' + h }).join('  '));
  
  // Utiliy functions, you can ignore these.
  function textToBin(text) { return textToBase(text, 2, 8); }
  function textToHex(t, w) { return pad(textToBase(t,16,2), roundUp(t.length, w)*2, '00'); }
  function pad(val, len, chr) { return (repeat(chr, len) + val).slice(-len); }
  function print(text) { document.getElementById('out').innerHTML += (text || ''); }
  function println(text) { print((text || '') + '\n'); }
  function repeat(chr, n) { return new Array(n + 1).join(chr); }
  function textToBase(text, radix, n) {
    return text.split('').reduce(function(result, chr) {
      return result + pad(chr.charCodeAt(0).toString(radix), n, '0');
    }, '');
  }
  function roundUp(numToRound, multiple) { 
    if (multiple === 0) return numToRound;
    var remainder = numToRound % multiple;
    return remainder === 0 ? numToRound : numToRound + multiple - remainder;
  }
}());
#out {
  white-space: pre;
  font-size: 0.8em;
}
<div id="out"></div>

我的解决方案(ES6 语法):

const source = "8d7f66a9273fc766cd66d1d";
const target = [];
for (
    const array = Array.from(source);
    array.length;
    target.push(array.splice(0,2).join(''), 2));

我们甚至可以用这个创建一个函数:

function splitStringBySegmentLength(source, segmentLength) {
    if (!segmentLength || segmentLength < 1) throw Error('Segment length must be defined and greater than/equal to 1');
    const target = [];
    for (
        const array = Array.from(source);
        array.length;
        target.push(array.splice(0,segmentLength).join('')));
    return target;
}

然后,您可以以可重用的方式轻松调用该函数:

const source = "8d7f66a9273fc766cd66d1d";
const target = splitStringBySegmentLength(source, 2);

干杯