Cómo dividir una cadena de texto y luego dividir el valor devuelto, conectado a otro valor que debe ser dividido, y unir el resto al restante.
Lo que quiero es algo así como una cadena que tenga alrededor de 2000 a 3000 caracteres con más de cien \n
ubicados de manera no uniforme en ellos, y quiero dividirlos por cada 1000 caracteres. Luego, en las cadenas devueltas en un array, para cada uno de los valores en el array devuelto, quiero terminar la cadena en el último \n
(dejándola como está si la cadena no contiene \n
) y el resto de la cadena después del último \n
debe ser agregado al principio del siguiente valor en el array, y luego esto debe llevarse a cabo DESPUÉS de que la cadena anterior haya sido modificada hasta el último \n
Espero que entiendas lo que quiero decir, y este es mi código
js
module.exports={
async split(text,length,max){
if (text.length > max){
return;
}
let regex = new RegExp(.{1,${length}}
, "g");
let splitted = text.match(regex);
return splitted;
}
}
El lugar donde se obtiene y se ejecuta es aquí:
js
let splitted = await split(lyrics,1000,6000)
Pude hacer la división para cada 1000 palabras, pero lo que expliqué anteriormente es lo que quiero hacer y no puedo lograrlo, ¿alguien puede ayudar?
EDITAR: Supongamos que quiero dividir la cadena en un máximo de 20 caracteres con una longitud máxima de cadena de 1000, y si se supera ese límite, significa que no se devolverá nada. Puede realizar esa segunda etapa de división (como mencioné en la pregunta como \n
) con un espacio en blanco ().
Imagina que la cadena es: Hello, I love Stack Overflow, and it is super cool
En mi código actual, si hicieramos
js
let string = Hello, I love Stack Overflow, and it is super cool
let splitted = await split(string, 10, 1000)
Devolvería
["Hello, I l", "ove Stack ", "Overflow, ", "and it is ", "super cool"]
¿Y si se agrega otro argumento en split()
, quedando así:
async split(text, length, max, splitAt)
splitAt
puede significar \n
o un espacio en blanco () dependiendo de la elección
El resultado que quiero devolver es: ["Hello, I", "love Stack", "Overflow,", "and it is", "super cool"]
Lo que sucede es que no puedo entender cómo hacerlo.
davy.ai
Para lograr el resultado deseado de dividir la cadena en cada 1000 caracteres, y luego dividir las cadenas resultantes en la última aparición de
\n
o, se puede utilizar el siguiente código:
La función
split()
ahora toma un parámetro adicional opcionalsplitAt
, que por defecto es\n
. Utiliza un bucle para procesar cada una de las cadenas resultantes después de la división inicial en fragmentos de 1000 caracteres. Para cada una de estas cadenas, encuentra la última aparición desplitAt
, y divide la cadena en ese índice. Luego agrega elremainder
de la cadena anterior al principio de la cadena actual antes de la división, y establece el nuevoremainder
como la subcadena después del índice de división. Una vez que se procesan todas las cadenas, agrega cualquierremainder
restante a la última cadena del arregloresult
.Con esta función actualizada, la ejecución del siguiente código:
producirá el resultado deseado: