如何将一个字符串分割成 n 个字符的段?

311

如标题所述,我有一个字符串,想将其分成每个n个字符一段。

例如:

var str = 'abcdefghijkl';

经过一些神奇的操作,n=3 将变为

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

有没有一种方法来做到这一点?


1
@ManoharReddyPoreddy,那个答案是错误的,因为其他人已经解释了。第一个答案非常详尽。 - akpi
@akpi 好的,我已经删除了我上面的评论(之前我推荐的答案可能没有评论,但对我很有效)。 - Manohar Reddy Poreddy
19个回答

546

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) || []);


从技术上讲,这是更好的答案,因为它将获取字符串中不能被3整除的所有文本(它将获取最后2个或1个字符)。 - Erik
8
请使用 [\s\S] 代替 .,以避免因换行符而失败。 - Mike Samuel
2
你可能想在每一行上开始一个新的循环。如果你确实有换行符,它们可能表示某种转换。str.match(/.{1,3}/gm) 可能是更好的选择。 - kennebec
4
可以在数字3的位置使用一个变量吗? - Ana Claudia
太棒了!同样的方法,str.match(/.{1}/g)将返回字符串的每个单独字符(几乎像str.split('')一样)。谢谢! - Vidal Quevedo
显示剩余3条评论

75

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

var chunks = [];

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

这里有一个jsFiddle。

......另外正则表达式的解决方案也非常不错 :)


1
+1 因为我更喜欢将 3 定义为一个变量,正如 OP 所建议的。这样比拼接正则表达式字符串更易读。 - David Tang
1
如果你能将它封装成一个有用的函数,准备好供使用,那该多好啊。 - mjs
1
这比正则表达式选项快10倍以上,所以我会选择这个(在函数内部) http://jsbench.github.io/#9cb819bf1ce429575f8535a211f72d5a - Job
1
我的上一条评论同样适用于Chromium(此外,我修改上一条评论时已经太晚了,所以写了这条新的)。在Firefox上,我当前使用的机器上速度“仅”快了30%,但仍然稳定地更好。 - Job
这在处理大量字符串时是否可持续? - J-Cake

44
str.match(/.{3}/g); // => ['abc', 'def', 'ghi', 'jkl']

这对我来说适用于 3,但在 250 中返回 null - Jim
尝试使用"AB".match(/.{3}/g),你会发现这不起作用。它至少需要{3}个字符才能完成匹配。 "ABCAB".match(/.{3}/g)也只会返回完整的匹配['ABC'] - caulitomaz

20

在之前的回答基础上,以下函数将按指定字符数(size)拆分字符串(str)。

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>


9

如果你真的需要使用 .split 和/或 .replace,那么请使用 /(?<=^(?:.{3})+)(?!$)/g

对于 .split

var arr = str.split( /(?<=^(?:.{3})+)(?!$)/ )
// [ 'abc', 'def', 'ghi', 'jkl' ]

对于.replace方法:

var replaced = str.replace( /(?<=^(?:.{3})+)(?!$)/g, ' || ' )
// 'abc || def || ghi || jkl'



/(?!$)/是为了不停在字符串的结尾。没有它,就会变成:

var arr = str.split( /(?<=^(?:.{3})+)/ )
// [ 'abc', 'def', 'ghi', 'jkl' ] // is fine
var replaced = str.replace( /(?<=^(.{3})+)/g, ' || ')
// 'abc || def || ghi || jkl || ' // not fine

忽略组/(?:...)/是为了防止数组中出现重复条目。如果没有它:
var arr = str.split( /(?<=^(.{3})+)(?!$)/ )
// [ 'abc', 'abc', 'def', 'abc', 'ghi', 'abc', 'jkl' ] // not fine
var replaced = str.replace( /(?<=^(.{3})+)(?!$)/g, ' || ' )
// 'abc || def || ghi || jkl' // is fine

5
var str = 'abcdefghijkl';
var res = str.match(/.../g)
console.log(res)

这里的点的数量决定了每个单词中包含的文本量。


4
我的解决方案(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);

干杯


3

我最喜欢的答案是Gouder Hicham的。但我稍微修改了一下,让它更符合我的理解。

let myString = "Able was I ere I saw elba";

let splitString = [];
for (let i = 0; i < myString.length; i = i + 3) {
    splitString.push(myString.slice(i, i + 3));
}

console.log(splitString);

这是一份功能化的代码版本。

function stringSplitter(myString, chunkSize) {
    let splitString = [];
    for (let i = 0; i < myString.length; i = i + chunkSize) {
        splitString.push(myString.slice(i, i + chunkSize));
    }
    return splitString;
}

以及该函数的使用:

let myString = "Able was I ere I saw elba";
let mySplitString = stringSplitter(myString, 3);
console.log(mySplitString);

并且这是它的结果:

>(9) ['Abl', 'e w', 'as ', 'I e', 're ', 'I s', 'aw ', 'elb', 'a']

3
const chunkStr = (str, n, acc) => {     
    if (str.length === 0) {
        return acc
    } else {
        acc.push(str.substring(0, n));
        return chunkStr(str.substring(n), n, acc);
    }
}
const str = 'abcdefghijkl';
const splittedString = chunkStr(str, 3, []);

无需正则表达式的清洁解决方案


2
尝试这个简单的代码,它会像魔法一样工作!
let letters = "abcabcabcabcabc";
// we defined our variable or the name whatever
let a = -3;
let finalArray = [];
for (let i = 0; i <= letters.length; i += 3) {
    finalArray.push(letters.slice(a, i));
  a += 3;
}
// we did the shift method cause the first element in the array will be just a string "" so we removed it
finalArray.shift();
// here the final result
console.log(finalArray);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接