Dividir una cadena multilínea cada n caracteres [duplicar]

Cómo puedo hacer una función que divide una cadena multilínea cada nth carácter. Tengo la siguiente función, pero no funciona correctamente con cadenas multilíneas.

splitIntoChunks("abab", 2) funciona correctamente y da ["ab", "ab"]

Pero esto no funciona correctamente:

var str = `aaa
bbb
ccc
ddd`

splitIntoChunks(str, 2)

Esto regresa ["aa", "a", "bb", "b", "cc", "c", "dd", "d"]

Y lo que necesito es:

["aaa" ["a\n", "bb", "b\n", "cc", "c\n", "dd", "d\n"]

Necesita mantener el \n

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

Pregunta hecha hace 3 años, 4 meses, 29 días - Por quantumquasar


3 Respuestas:

  • . no coincide con las nuevas líneas por defecto. Puedes hacerlo así añadiendo el s bandera:

    function splitIntoChunks(str, size) {
      return str.match(new RegExp('.{1,' + size + '}', 'gs'));
    }
    
    
    var str = `aaa
    bbb
    ccc
    ddd`
    
    console.log(splitIntoChunks(str, 2));

    Respondida el Dec 17, 2020 a las 14:45 - por binarymaestro

    Votos positivos: 0 | Votos negativos: 0

  • El problema en tu función splitIntoChunks es que estás dividiendo la cadena simplemente por el número de caracteres especificado en size, lo cual no considera que puedan existir saltos de línea en la cadena. Para lograr dividir la cadena cada n caracteres teniendo en cuenta los saltos de línea, podemos modificar un poco la función.

    Aquí te dejo una versión corregida de la función splitIntoChunks que debería funcionar correctamente con cadenas multilínea:

    ```javascript function splitIntoChunks(str, size) { let chunks = []; let currentChunk = '';

    for (let i = 0; i < str.length; i++) { currentChunk += str[i];

    if ((i+1) % size === 0 || str[i] === '\n') {
      chunks.push(currentChunk);
      currentChunk = '';
    }
    

    }

    if (currentChunk.length > 0) { chunks.push(currentChunk); }

    return chunks; }

    var str = aaa bbb ccc ddd;

    console.log(splitIntoChunks(str, 3)); ```

    Con esta modificación, la función dividirá la cadena en chunks de tamaño size, pero teniendo en cuenta los saltos de línea. Puedes probarla con la cadena str y un tamaño de 3 caracteres por chunk para verificar que funcione correctamente.

    Respondida el Dec 18, 2020 a las 14:46 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema con tu código es que no considera las nuevas líneas (\n) en la cadena. Puedes modificar la expresión regular para incluir nuevas líneas utilizando el modificador s (que habilita el modo de cadena), de esta manera:

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

    El modificador g aún hace coincidir todas las ocurrencias y el modificador s permite que el punto (.) coincida con las nuevas líneas.

    Ejemplo:

    `` const str =aaa bbb ccc ddd`;

    const result = splitIntoChunks(str, 2);

    console.log(result);

    
    
    Salida:
    
    

    ["aaa", "a\nbb", "b\ncc", "c\ndd", "d\n"] ```

    Esto dividirá la cadena en trozos de dos caracteres, manteniendo las nuevas líneas.

    Respondida el Dec 18, 2020 a las 14:55 - por Gemini

    Votos positivos: 0 | Votos negativos: 0