2011-06-07 12 views

Respuesta

226

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

Nota: El uso{1,3} en lugar de sólo {3} para incluir el resto de longitudes de cadena que no son múltiplos de 3, p. ej .:

console.log("abcd".match(/.{1,3}/g)); // ["abc", "d"]


un par de sutilezas:

  1. Si la cadena puede contener saltos de línea (que desea contar como un personaje en lugar de dividir la cadena), entonces el . no capturará esos. Use /[\s\S]{1,3}/ en su lugar. (Gracias @Mike).
  2. Si su cadena está vacía, entonces match() devolverá null cuando pueda estar esperando una matriz vacía. Proteja contra esto agregando || [].

Así que usted puede terminar con:

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

+9

+1 agradable y en la captura '{1,3}' :) – alex

+0

Esta es, técnicamente, la mejor respuesta, ya que tomará todo el texto de una cadena que no es divisible por 3 (captará los últimos 2 o 1 caracteres) – Erik

+6

Use '[\ s \ S]' en lugar de '.' para no fallar en las nuevas líneas. –

28

Si no desea utilizar una expresión regular ...

var chunks = []; 

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

jsFiddle.

... de lo contrario la solución de expresiones regulares es bastante bueno :)

+13

+1 becaus e regex me causa dolor – Marty

+1

+1 cos Preferiría esto si el '3' es variable como lo sugiere el OP. Es más legible que concatenar una cadena de expresiones regulares. –

+0

si solo pudiera envolverlo en una función útil lista para ser utilizada – momomo

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

Sobre la base de las respuestas anteriores a esta pregunta; la siguiente función dividirá una cadena (str) n-number (size) de caracteres.

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

demostración

(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>

1
function chunk(er){ 
return er.match(/.{1,75}/g).join('\n'); 
} 

Por encima de la función es lo que yo uso para la base 64 de fragmentación. Creará un salto de línea de 75 caracteres.

+0

También podría hacer 'replace (/. {1,75}/g, '$ & \ n')'. – alex

0

Algunos solución limpia y sin el uso de expresiones regulares: ejemplo

/** 
* 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; 
}; 

Uso - https://jsfiddle.net/maciejsikora/b6xppj4q/.

También traté de comparar mi solución para regexp que se eligió como respuesta correcta. Se puede encontrar alguna prueba en jsfiddle - https://jsfiddle.net/maciejsikora/2envahrk/. Las pruebas muestran que ambos métodos tienen un rendimiento similar, tal vez en el primer vistazo, la solución de expresiones regulares es un poco más rápida, pero juzgue usted mismo.

0

Aquí hay dos forro rápida que commafies números:

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]; 
} 

si se extendían, que podría tener este aspecto:

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

En primer lugar, aryPart1 se asigna con un partido de expresiones regulares que consta de [0 a 2 números], seguido de [cadena de caracteres cuya longitud es un múltiplo de 3], y luego [cero o uno sin dígitos y todo lo demás].

Luego, si no es "", agregamos los [0 a 2 números] a aryChunks.

Después de eso, tomamos la [cadena de caracteres cuya longitud es múltiplo de 3] y la regex los combina en una matriz de [3 caracteres] llamada aryPart2, que luego empalmamos con aryChunks.

Ahora aryChunks contiene los trozos que uniremos con una coma y asignaremos a outVal.

Todo lo que queda por hacer es agregar el [cero o uno que no sea un dígito y todo lo demás] a outVal, y devolver outVal a la persona que llama.

Según el OP, {0,2} y {3} en la expresión regular 1 y {3} en la expresión regular 2 pueden ser variables para hacer que los fragmentos tengan cualquier longitud, y \ d en las expresiones regulares se puede cambiar a "." si quieres que funcione en más que solo números.

Pasé demasiado tiempo escribiendo esto, por lo que podría haber un par de problemas técnicos. Apúntalos y los modificaré.

0

Mi solución (sintaxis ES6):

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

Podríamos incluso crear una función con esto:

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

A continuación, puede llamar a la función fácilmente de una manera reutilizable:

const source = "8d7f66a9273fc766cd66d1d"; 
const target = splitStringBySegmentLength(source, 2); 

Cheers

Cuestiones relacionadas