Puedes hacer algo como esto:
"1234567890".match(/.{1,2}/g);
// Results in:
["12", "34", "56", "78", "90"]
El método seguirá funcionando con cadenas cuyo tamaño no es un múltiplo exacto del tamaño del fragmento:
"123456789".match(/.{1,2}/g);
// Results in:
["12", "34", "56", "78", "9"]
En general, para cualquier cadena de la que desee extraer a lo sumo n subcadenas de tamaño n , haría lo siguiente:
str.match(/.{1,n}/g); // Replace n with the size of the substring
Si su cadena puede contener nuevas líneas o retornos de carro, haría lo siguiente:
str.match(/(.|[\r\n]){1,n}/g); // Replace n with the size of the substring
En cuanto al rendimiento, probé esto con aproximadamente 10k caracteres y me tomó un poco más de un segundo en Chrome. YMMV.
Esto también se puede usar en una función reutilizable:
function chunkString(str, length) {
return str.match(new RegExp('.{1,' + length + '}', 'g'));
}
.
no coincide con la nueva línea en absoluto. Voy a actualizar la respuesta por lo que se necesita\n
y\r
en cuenta.var chunks = str.split("").reverse().join().match(/.{1, 4}/).map(function(s) { return s.split("").reverse().join(); });
. Esto lo hace en trozos de 4. No estoy seguro de lo que quiere decir con "menos o más". Tenga en cuenta que esto no funcionará en general, especialmente con cadenas que contienen caracteres combinados y también pueden romper cadenas Unicode.[^]
. Con esto su ejemplo resultaría enstr.match(/[^]{1,n}/g)
Creé varias variantes más rápidas que puedes ver en jsPerf . Mi favorito es este:
fuente
Math.ceil()
para determinar la cantidad correcta de fragmentos.match
,slice
,substr
ysubstring
match
yslice
para diferentes tamaños de trozosmatch
yslice
con un pequeño tamaño de trozoLínea de fondo:
match
es muy ineficiente,slice
es mejor, en Firefoxsubstr
/substring
es aún mejormatch
es aún más ineficiente para cadenas cortas (incluso con expresiones regulares en caché, probablemente debido al tiempo de configuración del análisis de expresiones regulares)match
es aún más ineficiente para un gran tamaño de fragmento (probablemente debido a la incapacidad de "saltar")match
superaslice
el IE anterior pero aún pierde en todos los demás sistemasfuente
Esta es una solución rápida y sencilla:
fuente
substr()
lugar desubstring()
.¡Sorpresa! Puedes usar split para dividir.
Resultados en
[ '12', '34', '56', '78', '90', ' ' ]
fuente
filter (o=>o)
para?filter(x=>x)
se usa para filtrar esos elementos vacíosfuente
He escrito una función extendida, por lo que la longitud del fragmento también puede ser una matriz de números, como [1,3]
El código
volverá:
fuente
divide la cadena grande en cadenas pequeñas de palabras dadas .
fuente
fuente
Yo usaría una expresión regular ...
fuente
Llámalo según sea necesario
fuente
Aquí hay una solución que se me ocurrió para las cadenas de plantillas después de un poco de experimentación:
Uso:
fuente
Puede usar
reduce()
sin ninguna expresión regular:fuente
reduce
método.En forma de una función prototipo:
fuente
Aquí está el código que estoy usando, usa String.prototype.slice .
Sí, la respuesta es bastante larga, ya que trata de seguir los estándares actuales lo más cerca posible y, por supuesto, contiene una cantidad razonable de JSDOC comentarios . Sin embargo, una vez minimizado, el código tiene solo 828 bytes y una vez comprimido para la transmisión, solo tiene 497 bytes.
El 1 método al que esto se agrega
String.prototype
(usando Object.defineProperty donde esté disponible) es:Se han incluido varias pruebas para verificar la funcionalidad.
¿Le preocupa que la longitud del código afecte el rendimiento? No hay que preocuparse, http://jsperf.com/chunk-string/3
Gran parte del código adicional está ahí para asegurarse de que el código responderá de la misma manera en múltiples entornos javascript.
fuente
Usando el método slice ():
Lo mismo se puede hacer usando el método substring ().
fuente
Mi problema con la solución anterior es que lleva la cadena en trozos de tamaño formal independientemente de la posición en las oraciones.
Creo que el siguiente es un mejor enfoque; aunque necesita algunos ajustes de rendimiento:
fuente
Definitivamente puedes hacer algo como
para obtener esto:
Si desea ingresar / ajustar dinámicamente el tamaño del fragmento para que los fragmentos sean de tamaño n, puede hacer esto:
Para encontrar todos los trozos de tamaño n posibles en la cadena original, intente esto:
Deberías terminar con:
fuente
fuente
¿Qué pasa con este pequeño código?
fuente
fuente