Como remover todas as quebras de linha de uma string

440

Eu tenho um texto em uma área de texto e li-o usando o atributo .value.

Agora eu gostaria de remover todas as quebras de linha (o caractere produzido quando você pressiona Enter) do meu texto agora usando .replace com uma expressão regular, mas como eu indico uma quebra de linha em uma regex?

Se isso não for possível, existe outro caminho?

Wingblade
fonte

Respostas:

501

Este é provavelmente um FAQ. De qualquer forma, quebras de linha (melhor: novas linhas) podem ser de retorno de carro (CR, \rem Macs mais antigos), avanço de linha (LF \n, em Unices, incluindo Linux) ou CR seguido por LF ( \r\nem WinDOS). (Ao contrário de outra resposta, isso não tem nada a ver com a codificação de caracteres.)

Portanto, o RegExpliteral mais eficiente para corresponder a todas as variantes é

/\r?\n|\r/

Se você deseja corresponder a todas as novas linhas em uma sequência, use uma correspondência global,

/\r?\n|\r/g

respectivamente. Em seguida, continue com o replacemétodo conforme sugerido em várias outras respostas. (Provavelmente você não deseja remover as novas linhas, mas substitua-as por outros espaços em branco, por exemplo, o caractere de espaço, para que as palavras permaneçam intactas.)

Orelhas pontudas
fonte
16
Para fins de completude, deve-se notar que existem quatro caracteres de nova linha diferentes no Unicode: \u000aou \n, que é um feed de linha; \u000dou \r, que é um retorno de carro; \u2028, um separador de linha; e \u2029um separador de parágrafos. Na prática, porém, o regex que você postou é suficiente na maioria dos casos.
Mathias Bynens
4
@MathiasBynens Obrigado, mas U + 2028 e U + 2029 não constituem explicitamente quebras de linha em HTML (4.01), nas quais a árvore DOM e o valor ativo da área de texto
PointedEars
5
@PointedEars Sim, mas a serialização HTML não ocorre ao definir a área de texto .valuedinamicamente, por exemplo textarea.value = 'a\u2029b'; textarea.value.charAt(1) == '\u2029'; // true. Mas este é provavelmente um caso extremo - como eu disse, na maioria dos casos o seu regex é suficiente.
Mathias Bynens
2
@MathiasBynens Como o U + 2028 e o U + 2029 não constituem quebras de linha no HTML (4.01), essa atribuição não exibe duas linhas na área de texto com qualquer mecanismo de implementação e layout do DOM principal. Portanto, ninguém em sã consciência faria tal tarefa em primeiro lugar.
PointedEars
1
Eu tive que escapar da barra invertida para fazer isso funcionar para mim, ou seja, textIn.replace (/ (\\ r \\ n | \\ n | \\ r) / gm, ""). +1 ainda. Obrigado
Crab Bucket
511

Como você encontrará uma quebra de linha varia entre as codificações do sistema operacional. O Windows seria \r\n, mas o Linux apenas usa \ne a Apple \r.

Encontrei isso nas quebras de linha do JavaScript :

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

Isso deve remover todos os tipos de quebras de linha.

Eremita
fonte
18
Por que é ter o separado \r\n e \n e \r melhor do que apenas /[\n\r]/g? Certamente isso é mais lento do que deveria, pois ele só precisa verificar cada caractere contra o conjunto de duas opções possíveis.
Gone Coding
2
Ao analisar os dados retornados do memcached no node.js, use / [\ n \ r] / g. Graças à codificação ido! A opção na resposta a matou.
Kyle galeirões
111

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

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

String.trim() remove os espaços em branco do início e do fim das strings ... incluindo novas linhas.

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!!!"

Aqui está um exemplo de violino: http://jsfiddle.net/BLs8u/

NOTA! apara apenas o início e o fim da sequência, não as quebras de linha ou os espaços em branco no meio da sequência.

RobW
fonte
33
Isso remove apenas quebras de linha do início e do fim da string. O OP perguntou como remover TODAS as quebras de linha.
Ian Walter
4
Sim, apenas adicionando como uma opção.
RobW
1
Trabalhei para o que eu precisava - começo e fim da string. Obrigado!
Harlin
46

Você pode usar \nem uma regex para novas linhas e \rpara retornos de carro.

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

Sistemas operacionais diferentes usam terminações de linha diferentes, com misturas variadas de \ne \r. Esse regex substituirá todos eles.

Kendall Frey
fonte
Eu acho que isso só substituirá a primeira ocorrência.
Sebas 29/05
5
/\n|\r/gé escrito de forma mais eficiente /[\n\r]/gou uniforme /[\n\r]+/g. Evite a alternância, a menos que seja absolutamente necessário.
PointedEars
Não tenho certeza se isso é uma reclamação. Ele faz o que eu disse: remova TUDO que não esteja nessa faixa HEX. Quais caracteres dependem do conjunto de caracteres, é claro, mas este post foi sobre ASCII.
masi
22

Se você deseja remover todos os caracteres de controle, incluindo CR e LF, pode usar este:

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

Ele removerá todos os caracteres não imprimíveis. Todos esses caracteres NÃO estão no espaço ASCII HEX 0x20-0x7E. Sinta-se à vontade para modificar o intervalo HEX conforme necessário.

masi
fonte
2
Isso também irá remover alguns caracteres nacionais de outros idiomas além do Inglês ....
smentek
21

A solução mais simples seria:

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()com /\s+/gregexp está alterando todos os grupos de caracteres de espaços em branco para um único espaço em toda a cadeia, .trim()o resultado é a remoção de todos os espaços em branco excedentes antes e depois do texto.

São considerados caracteres de espaços em branco:
[ \f\n\r\t\v​\u00a0\u1680​\u2000​-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]

Freezystem
fonte
Incrível, mas eu consegui trabalhar re-atribuindo a variável:str = str.replace(/\s+/g, ' ').trim();
Fred K
15
var str = "bar\r\nbaz\nfoo";

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

>> "barbazfoo"
Gordon Freeman
fonte
15

Para remover novos caracteres de linha, use o seguinte:

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

Em seguida, você pode aparar sua corda para remover espaços à esquerda e à direita:

yourString.trim()
Si7ius
fonte
6

A resposta fornecida pelo PointedEars é tudo o que a maioria de nós precisa. Mas, seguindo a resposta de Mathias Bynens, fiz uma viagem à Wikipedia e encontrei o seguinte: https://en.wikipedia.org/wiki/Newline .

A seguir, é apresentada uma função que implementa tudo o que a página Wiki acima considera "nova linha" no momento desta resposta.

Se algo não se encaixar no seu caso, basta removê-lo. Além disso, se você está procurando desempenho, pode não ser isso, mas uma ferramenta rápida que faça o trabalho em qualquer caso, isso deve 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
fonte
3
Primeiro - para as pessoas que acham que isso não usa JS - "a maioria" suporta os sabores de RE, \Rque são "todos" os feeds de linha. Em segundo lugar - por que não simplesmentesomeString.replace(new RegExp(lineTerminators.join('|')), '');
SamWhan
@ClasG, você faz um bom argumento. Eu acho que minha linha de pensamento quando escrevi isso era executar apenas replace()o lineTerminatorsque existia na string por razões de desempenho.
Futz.co
5

Uma quebra de linha no regex é \ n, portanto, seu script seria

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

Estou adicionando minha resposta, é apenas um complemento para o acima, pois para mim eu tentei todas as opções / n e não funcionou, vi que meu texto está vindo do servidor com barra dupla, então usei isso:

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

USE ESTA FUNÇÃO ABAIXO E FAÇA SUA VIDA FÁCIL

A abordagem mais fácil é usar expressões regulares para detectar e substituir novas linhas na string. Nesse caso, usamos a função replace junto com a string para substituir, que no nosso caso é uma string vazia.

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

Na expressão acima, g e m são para sinalizadores globais e multilinhas

vishu2124
fonte
2

Tente o seguinte código. Funciona em todas as 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
fonte
0

No mac, basta usar \nno regexp para corresponder a quebras de linha. Portanto, o código será string.replace(/\n/g, ''), ps: o g seguido significa combinar todos, em vez de apenas o primeiro.

Nas janelas, será \r\n.

kobako
fonte