我想把一个非常大的字符串(比如10,000个字符)分割成n大小的块。

就性能而言,最好的方法是什么?

例如: "1234567890"除以2将变成["12","34","56","78","90"]。

使用string。prototype。match可以实现这样的事情吗如果可以,从性能来看,这是最好的方式吗?


当前回答

你可以这样做:

"1234567890".match(/.{1,2}/g);
// Results in:
["12", "34", "56", "78", "90"]

如果字符串的大小不是chunk-size的倍数,该方法仍然有效:

"123456789".match(/.{1,2}/g);
// Results in:
["12", "34", "56", "78", "9"]

一般来说,对于任何你想要提取最多n个子字符串的字符串,你可以这样做:

str.match(/.{1,n}/g); // Replace n with the size of the substring

如果你的字符串可以包含换行符或回车,你会这样做:

str.match(/(.|[\r\n]){1,n}/g); // Replace n with the size of the substring

至于性能,我用了大约10k个字符,在Chrome上花了一秒钟多一点的时间。YMMV。

这也可以用在可重用函数中:

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

其他回答

比较match, slice, substr和substring 不同块大小的匹配和切片的比较 小块大小的匹配和切片的比较

底线:

match非常低效,slice更好,在Firefox上substr/substring更好 匹配对于短字符串来说效率更低(即使使用缓存的regex -可能是因为regex解析设置时间) 对于大块大小的匹配效率更低(可能是由于无法“跳跃”) 对于更长的字符串和非常小的块大小,match在旧的IE上优于slice,但在所有其他系统上仍然失败 jsperf岩石

const getChunksFromString = (str, chunkSize) => {
    var regexChunk = new RegExp(`.{1,${chunkSize}}`, 'g')   // '.' represents any character
    return str.match(regexChunk)
}

根据需要调用它

console.log(getChunksFromString("Hello world", 3))   // ["Hel", "lo ", "wor", "ld"]

惊喜!你可以使用split来分割。

var parts = "1234567890 ".split(/(.{2})/).filter(O=>O)

结果显示['12','34','56','78','90',' ']

我对上述解决方案的问题是,不管在句子中的位置如何,它都将字符串划分为正式的大小块。

我认为下面的方法比较好;虽然它需要一些性能调整:

 static chunkString(str, length, size,delimiter='\n' ) {
        const result = [];
        for (let i = 0; i < str.length; i++) {
            const lastIndex = _.lastIndexOf(str, delimiter,size + i);
            result.push(str.substr(i, lastIndex - i));
            i = lastIndex;
        }
        return result;
    }
var l = str.length, lc = 0, chunks = [], c = 0, chunkSize = 2;
for (; lc < l; c++) {
  chunks[c] = str.slice(lc, lc += chunkSize);
}