Cómo eliminar todos los saltos de línea de una cadena

441

Tengo un texto en un área de texto y lo leí usando el atributo .value.

Ahora me gustaría eliminar todos los saltos de línea (el carácter que se produce al presionar Enter) de mi texto que ahora usa .replace con una expresión regular, pero ¿cómo indico un salto de línea en una expresión regular?

Si eso no es posible, ¿hay otra manera?

Wingblade
fuente

Respuestas:

502

Esta es probablemente una pregunta frecuente. De todos modos, los saltos de línea (mejor: nuevas líneas) pueden ser uno de retorno de carro (CR, \ren Macs más antiguos), avance de línea (LF \n, en Unices incluyendo Linux) o CR seguido de LF ( \r\n, en WinDOS). (Contrariamente a otra respuesta, esto no tiene nada que ver con la codificación de caracteres).

Por lo tanto, el RegExpliteral más eficiente para coincidir con todas las variantes es

/\r?\n|\r/

Si desea hacer coincidir todas las líneas nuevas en una cadena, use una coincidencia global,

/\r?\n|\r/g

respectivamente. Luego proceda con el replacemétodo como se sugiere en varias otras respuestas. (Probablemente no desee eliminar las nuevas líneas, sino reemplazarlas con otros espacios en blanco, por ejemplo, el carácter de espacio, para que las palabras permanezcan intactas).

Orejas puntiagudas
fuente
16
En aras de la exhaustividad, debe tenerse en cuenta que hay cuatro nuevos caracteres de línea diferentes en Unicode: \u000ao \n, que es un avance de línea; \u000do \r, que es un retorno de carro; \u2028, un separador de línea; y \u2029un separador de párrafos. Sin embargo, en la práctica, la expresión regular que publicaste es suficiente en la mayoría de los casos.
Mathias Bynens
44
@MathiasBynens Gracias, pero U + 2028 y U + 2029 explícitamente no constituyen saltos de línea en HTML (4.01), en los que se basan el árbol DOM y el valor en vivo del área de texto: w3.org/TR/html4/struct/text.html #whitespace
PointedEars
55
@PointedEars Sí, pero la serialización HTML no se produce al configurar .valuedinámicamente el área de texto, por ejemplo textarea.value = 'a\u2029b'; textarea.value.charAt(1) == '\u2029'; // true. Pero este es probablemente un caso extremo: como dije, en la mayoría de los casos su expresión regular es suficiente.
Mathias Bynens
2
@MathiasBynens Debido a que U + 2028 y U + 2029 no constituyen saltos de línea en HTML (4.01), esa asignación no muestra dos líneas en el área de texto con ningún motor principal de implementación y diseño de DOM. Entonces, nadie en su sano juicio haría esa tarea en primer lugar.
PointedEars
1
Tuve que escapar de la barra invertida para que esto funcione para mí, es decir, textIn.replace (/ (\\ r \\ n | \\ n | \\ r) / gm, ""). +1 aún. Gracias
Crab Bucket
513

La forma de encontrar un salto de línea varía entre las codificaciones del sistema operativo. Windows lo sería \r\n, pero Linux solo usa \ny Apple usa \r.

Encontré esto en saltos de línea de JavaScript :

someText = someText.replace(/(\r\n|\n|\r)/gm, "");

Eso debería eliminar todo tipo de saltos de línea.

Eremita
fuente
19
¿Por qué es tener la separada \r\n e \n y \r mejor que sólo /[\n\r]/g? Seguramente esto es más lento de lo que debería ser, ya que solo necesita verificar cada personaje contra el conjunto de dos opciones posibles.
Gone Coding
2
Cuando el análisis devolvió datos de memcached en node.js usando / [\ n \ r] / g fue el truco para mí. Gracias ido codificación! La opción en la respuesta lo mató.
Kyle Coots
111

var str = " \n this is a string \n \n \n"

console.log(str);
console.log(str.trim());

String.trim() elimina los espacios en blanco desde el principio y el final de las cadenas ... incluidas las nuevas líneas.

const myString = "   \n \n\n Hey! \n I'm a string!!!         \n\n";
const trimmedString = myString.trim();

console.log(trimmedString);
// outputs: "Hey! \n I'm a string!!!"

Aquí hay un ejemplo de violín: http://jsfiddle.net/BLs8u/

¡NOTA! solo recorta el principio y el final de la cadena, no los saltos de línea o los espacios en blanco en el medio de la cadena.

RobW
fuente
34
Esto solo elimina los saltos de línea desde el principio y el final de la cadena. OP preguntó cómo eliminar TODOS los saltos de línea.
Ian Walter
44
Sí, solo agregando como una opción.
RobW
1
Trabajó para lo que necesitaba: principio y final de la cadena. ¡Gracias!
Harlin
47

Puede usar \nen una expresión regular para líneas nuevas y \rpara retornos de carro.

var str2 = str.replace(/\n|\r/g, "");

Los diferentes sistemas operativos utilizan diferentes finales de línea, con diferentes mezclas de \ny \r. Esta expresión regular los reemplazará a todos.

Kendall Frey
fuente
Creo que esto solo reemplazará la primera ocurrencia
Sebas,
55
/\n|\r/gestá escrito de manera más eficiente /[\n\r]/go incluso /[\n\r]+/g. Evite la alternancia a menos que lo necesite absolutamente.
PointedEars
No estoy seguro si esto es una queja. Hace lo que dije: eliminar TODO lo que no esté en ese rango HEX. Los caracteres que dependen dependen del conjunto de caracteres, por supuesto, pero esta publicación fue sobre ASCII.
masi
22

Si desea eliminar todos los caracteres de control, incluidos CR y LF, puede usar esto:

myString.replace(/[^\x20-\x7E]/gmi, "")

Eliminará todos los caracteres no imprimibles. Estos son todos los caracteres NOT dentro del espacio HEX ASCII 0x20-0x7E. Siéntase libre de modificar el rango HEX según sea necesario.

masi
fuente
2
Eso también eliminará algunos caracteres nacionales de otros idiomas además del inglés ...
smentek
21

La solución más simple sería:

let str = '\t\n\r this  \n \t   \r  is \r a   \n test \t  \r \n';
str.replace(/\s+/g, ' ').trim();
console.log(str); // logs: "this is a test"

.replace()with /\s+/gregexp está cambiando todos los grupos de caracteres de espacios en blanco a un solo espacio en toda la cadena, luego .trim()el resultado es eliminar todos los espacios en blanco excedentes antes y después del texto.

Se consideran caracteres de espacios en blanco:
[ \f\n\r\t\v​\u00a0\u1680​\u2000​-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]

Freezystem
fuente
Impresionante, pero lo tengo funcionando reasignando la variable:str = str.replace(/\s+/g, ' ').trim();
Fred K
15
var str = "bar\r\nbaz\nfoo";

str.replace(/[\r\n]/g, '');

>> "barbazfoo"
Gordon Freeman
fuente
15

Para eliminar nuevos caracteres de línea, use esto:

yourString.replace(/\r?\n?/g, '')

Luego puede recortar su cadena para eliminar los espacios iniciales y finales:

yourString.trim()
Si7ius
fuente
6

La respuesta proporcionada por PointedEars es todo lo que la mayoría de nosotros necesitamos. Pero siguiendo la respuesta de Mathias Bynens, realicé un viaje a Wikipedia y encontré esto: https://en.wikipedia.org/wiki/Newline .

La siguiente es una función desplegable que implementa todo lo que la página Wiki anterior considera "nueva línea" en el momento de esta respuesta.

Si algo no se ajusta a su caso, simplemente retírelo. Además, si está buscando rendimiento, puede que no lo sea, pero para una herramienta rápida que haga el trabajo en cualquier caso, esto debería ser útil.

// replaces all "new line" characters contained in `someString` with the given `replacementString`
const replaceNewLineChars = ((someString, replacementString = ``) => { // defaults to just removing
  const LF = `\u{000a}`; // Line Feed (\n)
  const VT = `\u{000b}`; // Vertical Tab
  const FF = `\u{000c}`; // Form Feed
  const CR = `\u{000d}`; // Carriage Return (\r)
  const CRLF = `${CR}${LF}`; // (\r\n)
  const NEL = `\u{0085}`; // Next Line
  const LS = `\u{2028}`; // Line Separator
  const PS = `\u{2029}`; // Paragraph Separator
  const lineTerminators = [LF, VT, FF, CR, CRLF, NEL, LS, PS]; // all Unicode `lineTerminators`
  let finalString = someString.normalize(`NFD`); // better safe than sorry? Or is it?
  for (let lineTerminator of lineTerminators) {
    if (finalString.includes(lineTerminator)) { // check if the string contains the current `lineTerminator`
      let regex = new RegExp(lineTerminator.normalize(`NFD`), `gu`); // create the `regex` for the current `lineTerminator`
      finalString = finalString.replace(regex, replacementString); // perform the replacement
    };
  };
  return finalString.normalize(`NFC`); // return the `finalString` (without any Unicode `lineTerminators`)
});
futz.co
fuente
3
Primero, para las personas que encuentran que esto no usa JS, "la mayoría" de los sabores RE son compatibles con \R"todos" los avances de línea. En segundo lugar, por qué no simplementesomeString.replace(new RegExp(lineTerminators.join('|')), '');
SamWhan
@ClasG, haces un buen punto. Creo que mi línea de pensamiento cuando escribí esto era correr solo replace()por lo lineTerminatorsque existía en la cadena por razones de rendimiento.
futz.co
5

Un salto de línea en la expresión regular es \ n, por lo que su secuencia de comandos sería

var test = 'this\nis\na\ntest\nwith\newlines';
console.log(test.replace(/\n/g, ' '));
h2ooooooo
fuente
5

Estoy agregando mi respuesta, es solo un complemento de lo anterior, ya que para mí probé todas las opciones / n y no funcionó, vi que mi texto proviene del servidor con doble barra, así que utilicé esto:

var fixedText = yourString.replace(/(\r\n|\n|\r|\\n)/gm, '');
chaya D
fuente
5

UTILICE ESTA FUNCIÓN A CONTINUACIÓN Y HAGA SU VIDA FÁCIL

El enfoque más fácil es usar expresiones regulares para detectar y reemplazar nuevas líneas en la cadena. En este caso, usamos la función de reemplazo junto con una cadena para reemplazar, que en nuestro caso es una cadena vacía.

function remove_linebreaks( var message ) {
    return message.replace( /[\r\n]+/gm, "" );
}

En la expresión anterior, g y m son para indicadores globales y multilínea

vishu2124
fuente
2

Prueba el siguiente código. Funciona en todas las plataformas.

var break_for_winDOS = 'test\r\nwith\r\nline\r\nbreaks';
var break_for_linux = 'test\nwith\nline\nbreaks';
var break_for_older_mac = 'test\rwith\rline\rbreaks';

break_for_winDOS.replace(/(\r?\n|\r)/gm, ' ');
//output
'test with line breaks'

break_for_linux.replace(/(\r?\n|\r)/gm, ' ');
//output
'test with line breaks'

break_for_older_mac.replace(/(\r?\n|\r)/gm, ' ');
// Output
'test with line breaks'
Robson Morais Santos
fuente
0

En mac, solo use \nen regexp para hacer coincidir los saltos de línea. Entonces el código será string.replace(/\n/g, ''), ps: la g seguida significa que coinciden con todos en lugar de solo el primero.

En Windows, lo será \r\n.

kobako
fuente