Javascript优雅的方式将string拆分成长度为n个字符的段

正如标题所说,我有一个string,我想分成n个字符长的段。

例如:

var str = 'abcdefghijkl'; 

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

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

有没有一个优雅的方式来做到这一点?

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

如果你不想使用正则expression式…

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

jsFiddle 。

…否则正则expression式的解决scheme是相当不错的:)

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

在以前对这个问题的答案的基础上; 以下函数将分割一个string( 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> 
 function chunk(er){ return er.match(/.{1,75}/g).join('\n'); } 

以上function是我用于Base64组块的。 它会创build一个有75个字符的换行符。

不使用正则expression式的一些干净的解

 /** * Create array with maximum chunk length = maxPartSize * It work safe also for shorter strings than part size **/ function convertStringToArray(str, maxPartSize){ const chunkArr = []; let leftStr = str; do { chunkArr.push(leftStr.substring(0, maxPartSize)); leftStr = leftStr.substring(maxPartSize, leftStr.length); } while (leftStr.length > 0); return chunkArr; }; 

用法示例 – https://jsfiddle.net/maciejsikora/b6xppj4q/

我也试图比较我的解决scheme正则expression式select正确的答案。 一些testing可以在jsfiddle上find – https://jsfiddle.net/maciejsikora/2envahrk/ 。 testing显示,这两种方法都有类似的performance,也许先看看正则expression式解决scheme是快一点,但自己判断一下。

这里有一个简单的两行数字,表示逗号数字:

 function commafy(inVal){ var ary = String(inVal).match(/(\d{0,2})((?:\d{3})*)([^\d].*$)/i); return (ary[1] == "" ? [] : [ary[1]]).splice(1, 0, ary[2].match(/[0-9]{3}/g)).join(",") + ary[3]; } 

如果分散开来,可能看起来像这样:

 function commafy(inVal){ var aryChunks = []; var inVal = String(inVal); var aryPart1 = inVal.match(/(\d{0,2})((?:\d{3})*)([^\d].*$)/i); if(aryPart1[1] != ""){ aryChunks.push(aryPart1[1]); } var aryPart2 = aryPart1[2].match(/[0-9]{3}/g); aryChunks.splice(1, 0, aryPart2); var outVal = aryChunks.join(","); outVal += aryPart1[3]; return outVal; } 

首先,aryPart1被赋予一个由[0到2数字]组成的正则expression式匹配,然后是[长度为3的倍数的string],然后是[零个或一个非数字以及其他所有内容]。

那么,如果不是“”,我们将[0到2数字]附加到aryChunk。

之后,我们将[长度为3的倍数的string]和正则expression式匹配成一个名为aryPart2的[3个字符]的数组,然后我们拼接成aryChunk。

现在aryChunk包含我们将join一个逗号和分配给outVal的块。

剩下要做的就是将[零个或一个非数字及其他]追加到outVal,并返回给调用者。

根据OP,正则expression式1中的{0,2}和{3}以及正则expression式2中的{3}可以是使块成为任意长度的variables,正则expression式中的\ d可以更改为“。 如果你想要它的工作不仅仅是数字。

我花了太长时间写这个,所以可能会有一些小故障。 指出他们,我会调整他们的。

我的解决scheme(ES6语法):

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

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

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

干杯