如标题所述,我有一个字符串,想将其分成每个n个字符一段。
例如:
var str = 'abcdefghijkl';
经过一些神奇的操作,n=3
将变为
var arr = ['abc','def','ghi','jkl'];
有没有一种方法来做到这一点?
如标题所述,我有一个字符串,想将其分成每个n个字符一段。
例如:
var str = 'abcdefghijkl';
经过一些神奇的操作,n=3
将变为
var arr = ['abc','def','ghi','jkl'];
有没有一种方法来做到这一点?
var str = 'abcdefghijkl';
console.log(str.match(/.{1,3}/g));
注意: 使用{1,3}
而不是{3}
,以包括字符串长度不是3的倍数的余数,例如:
console.log("abcd".match(/.{1,3}/g)); // ["abc", "d"]
还有一些微妙之处:
.
就不能捕获它们。改用/[\s\S]{1,3}/
。(感谢@Mike)。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) || []);
[\s\S]
代替 .
,以避免因换行符而失败。 - Mike Samuelstr.match(/.{1}/g)
将返回字符串的每个单独字符(几乎像str.split('')
一样)。谢谢! - Vidal Quevedo如果您不想使用正则表达式...
var chunks = [];
for (var i = 0, charsLength = str.length; i < charsLength; i += 3) {
chunks.push(str.substring(i, i + 3));
}
这里有一个jsFiddle。
......另外正则表达式的解决方案也非常不错 :)
3
定义为一个变量,正如 OP 所建议的。这样比拼接正则表达式字符串更易读。 - David Tangstr.match(/.{3}/g); // => ['abc', 'def', 'ghi', 'jkl']
3
,但在 250
中返回 null
。 - Jim"AB".match(/.{3}/g)
,你会发现这不起作用。它至少需要{3}个字符才能完成匹配。
"ABCAB".match(/.{3}/g)
也只会返回完整的匹配['ABC']
。 - caulitomaz在之前的回答基础上,以下函数将按指定字符数(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>
如果你真的需要使用 .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
var str = 'abcdefghijkl';
var res = str.match(/.../g)
console.log(res)
这里的点的数量决定了每个单词中包含的文本量。
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);
干杯
我最喜欢的答案是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']
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, []);
无需正则表达式的清洁解决方案
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);