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