Substituir quebras de linha em uma string C #

512

Como substituir quebras de linha em uma seqüência de caracteres em c #?

YonahW
fonte
2
Por favor, conte-nos mais: o que é uma "quebra de linha" para você? Com o que você deseja substituí-los?
Jay Bazuzi 26/10/08
ha ha. Eu estava verificando o mesmo em java quando descobri que System.getProperty ("line.separator") estava curioso para saber a contrapartida em c #. sua postagem me ajudou.
Ravisha 29/09/10

Respostas:

715

Use substituir por Environment.NewLine

myString = myString.Replace(System.Environment.NewLine, "replacement text"); //add a line terminating ;

Conforme mencionado em outras postagens, se a string vier de outro ambiente (SO), você precisará substituir a implementação desses ambientes em particular de novos caracteres de controle de linha .

Corin Blaikie
fonte
8
Primeiro, não funcionou para mim. Após algumas pesquisas, encontrei a solução: tive que usar 'using System;' ou 'System.Environment.NewLine'
Smolla 27/02
12
Não removeu todos os caracteres da nova linha. Tente esta string "\ n \ r \ nMinha mensagem \ r \ n \ n \ r \ n é essa. \ N \ n \ r \ n"
Shakti Prakash Singh
13
Em geral, eu gosto desta solução. No entanto, observe que, mesmo no mesmo sistema operacional, as novas linhas reais podem não corresponder. Isso aconteceu comigo porque o processamento retornou o SQL. As novas linhas foram \ n, enquanto Environment.NewLine foi \ r \ n. O resultado foi que nada foi correspondido e as novas linhas permaneceram.
Dono2
@Dono> de onde vêm os dados SQL? Provavelmente de uma fonte externa que lida com novas linhas da maneira UNIX. Isso é um problema com o formato de dados, não com OS ou este método ...
Laurent S.
Esse deve ser um dos métodos estáticos da classe String. NET em si deve ser capaz de detectar formato de quebras de linha de origem em uma corda e convertê-lo para Environment.NewLine \ r \ n formato ...
Dean Kuga
442

As soluções postadas até agora apenas substituem Environment.NewLineou falham se a sequência de substituição contiver quebras de linha porque são chamadas string.Replacevárias vezes.

Aqui está uma solução que usa uma expressão regular para fazer todas as três substituições em apenas uma passagem pela string. Isso significa que a cadeia de substituição pode conter com segurança quebras de linha.

string result = Regex.Replace(input, @"\r\n?|\n", replacementString);
Mark Byers
fonte
3
então o seu ditado em fazer Regex.Replace (input, @ "[\ r \ n] +", ReplacementString) não realizaria a mesma tarefa?
flamebaud
7
@flamebaud Não, isso produziria um resultado diferente se houver várias quebras de linha seguidas. "\ r \ n? | \ n" substituiria cada quebra de linha, enquanto "[\ r \ n] +" faria uma única substituição para qualquer número de quebras de linha.
David Hammond
Para aqueles preocupados com múltiplas quebras de linha: / (\ r \ n | \ n?) / Gm
BobbyA
4
Esta é realmente a solução correta se você deseja remover a quebra de linha em uma string que pode vir de diferentes sistemas operacionais. Um bom exemplo é a formatação JSON. +1
Bastien Vandamme 07/10
1
Se a string literal (@ prefix) não for usada, será necessário ter duas barras invertidas seguidas em todos os lugares em que for usada, portanto a resposta de @mark_byers acima ainda estará correta. O prefixo @ faz com que a barra invertida faça parte da cadeia de caracteres que deve ser usada pelo Regex para usá-lo como caractere de escape.
Kirk Liemohn
173

Para estender a resposta do The.Anyi.9, você também deve estar ciente dos diferentes tipos de quebra de linha em uso geral . Dependendo de onde o arquivo foi originado, convém verificar todas as alternativas ...

string replaceWith = "";
string removedBreaks = Line.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);

deve fazer você ir ...

ZombieSheep
fonte
6
Primeiro, gostei mais do ambiente, mas se o String não vier do sistema em execução, ele não funcionará. 1
Flo
1
não é Line.Replace("\n", replaceWith).Replace("\r", replaceWith);suficiente?
22615 Thomas Ayoub
5
Não, porque se você tiver, \r\nvocê terminará com a sequência de substituição duas vezes - não é o ideal.
ZombieSheep
1
Você não precisa de literais de string? string removedBreaks = Line.Replace (@ "\ r \ n", replaceWith) .Replace (@ "\ n", replaceWith) .Replace (@ "\ r", replaceWith);
Shawn Dotey
2
@ ShawnDotey não é necessário, queremos substituir caracteres de controle, não sequências de barra invertida e letra.
N.Kudryavtsev
38

Eu usaria Environment.Newline quando desejava inserir uma nova linha para uma string, mas não para remover todas as novas linhas de uma string.

Dependendo da sua plataforma, você pode ter diferentes tipos de novas linhas, mas mesmo dentro da mesma plataforma geralmente são usados ​​diferentes tipos de novas linhas. Em particular ao lidar com formatos e protocolos de arquivos.

string ReplaceNewlines(string blockOfText, string replaceWith)
{
    return blockOfText.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);
}
Brian R. Bondy
fonte
Essa é a única coisa que funcionou para mim quando eu queria recolher um código de página da web recuperado em uma única linha (para facilitar os padrões de expressão regular).
Paw Baltzersen
Concordo totalmente com Brian R. Bondy. A solução oferecida por Corin e tão votada é muito ingênua, pelo menos.
Califf 29/03
18

Se seu código deve ser executado em ambientes diferentes, eu consideraria usar a Environment.NewLineconstante, pois é especificamente a newlineusada no ambiente específico.

line = line.Replace(Environment.NewLine, "newLineReplacement");

No entanto, se você obtiver o texto de um arquivo originário de outro sistema, talvez essa não seja a resposta correta e substitua-a por qualquer constante de nova linha usada no outro sistema. Normalmente será \nou \r\n.

driis
fonte
É necessário redesigná-lo novamente para a variável original, pois a substituição não ocorre no local.
tvanfosson 26/10/08
@driss Gostaria de saber como você selecionaria uma constante nova linha correta quando não tem idéia de que sistema veio um arquivo ... essa solução realmente parece UNIVERSAL.
Califf
14

Não esqueça que substituir não faz a substituição na sequência, mas retorna uma nova sequência com os caracteres substituídos. A seguir, serão removidas as quebras de linha (não as substituídas). Eu usaria o método @Brian R. Bondy se os substituísse por outra coisa, talvez envolvida como um método de extensão. Lembre-se de verificar os valores nulos antes de chamar Substituir ou os métodos de extensão fornecidos.

string line = ...

line = line.Replace( "\r", "").Replace( "\n", "" );

Como métodos de extensão:

public static class StringExtensions
{
   public static string RemoveLineBreaks( this string lines )
   {
      return lines.Replace( "\r", "").Replace( "\n", "" );
   }

   public static string ReplaceLineBreaks( this string lines, string replacement )
   {
      return lines.Replace( "\r\n", replacement )
                  .Replace( "\r", replacement )
                  .Replace( "\n", replacement );
   }
}
tvanfosson
fonte
não pode ter ''em C # - não existe um caractere vazio. irá '\0'funcionar?
precisa
1
@ Shevek - apenas usou as aspas erradas. Deve ter feito uma boa quantidade de javascript no dia em que respondi a isso.
tvanfosson
@ Califf - é equivalente, não é melhor.
precisa saber é o seguinte
2
o erro que você cometeu aqui apenas prova que é melhor. A maioria das empresas em que trabalhei têm o padrão de codificação - NÃO USE LITERAIS HARDCODED.
Califf 03/02
2
@Califf O "erro" que cometi não teria sido cometido em um IDE com o Intellisense nem seria compilado. Se você acha que isso string.Emptyé melhor, use-o.
precisa saber é o seguinte
10

Para garantir que todas as formas possíveis de quebra de linha (Windows, Mac e Unix) sejam substituídas, você deve usar:

string.Replace("\r\n", "\n").Replace('\r', '\n').Replace('\n', 'replacement');

e nessa ordem, para não fazer quebras de linha extras, quando você encontrar uma combinação de caracteres de final de linha.

Dominik Szymański
fonte
8

se você quiser "limpar" as novas linhas, o comentário flamebaud usando regex @"[\r\n]+"é a melhor opção.

using System;
using System.Text.RegularExpressions;

class MainClass {
  public static void Main (string[] args) {
    string str = "AAA\r\nBBB\r\n\r\n\r\nCCC\r\r\rDDD\n\n\nEEE";

    Console.WriteLine (str.Replace(System.Environment.NewLine, "-"));
    /* Result:
    AAA
    -BBB
    -
    -
    -CCC


    DDD---EEE
    */
    Console.WriteLine (Regex.Replace(str, @"\r\n?|\n", "-"));
    // Result:
    // AAA-BBB---CCC---DDD---EEE

    Console.WriteLine (Regex.Replace(str, @"[\r\n]+", "-"));
    // Result:
    // AAA-BBB-CCC-DDD-EEE
  }
}
ewwink
fonte
A melhor resposta para substituir novas linhas, na maioria dos casos.
Shahbaz Ahmad
Obrigado por este código de exemplo útil. Eu fui corrigido através desta sytnax: Regex.Replace (str, @ "[\ r \ n] +", "-")
Sedat Kumcu
6

Eu precisava substituir o \r\ncom retorno de carro real e avanço de linha e substituir \tpor uma guia real. Então, eu vim com o seguinte:

public string Transform(string data)
{
    string result = data;
    char cr = (char)13;
    char lf = (char)10;
    char tab = (char)9;

    result = result.Replace("\\r", cr.ToString());
    result = result.Replace("\\n", lf.ToString());
    result = result.Replace("\\t", tab.ToString());

    return result;
}
Zamir
fonte
6

Por que não ambos?

string ReplacementString = "";

Regex.Replace(strin.Replace(System.Environment.NewLine, ReplacementString), @"(\r\n?|\n)", ReplacementString);

Nota: Substitua strinpelo nome da sua sequência de entrada.

RAIO
fonte
4
var answer = Regex.Replace(value, "(\n|\r)+", replacementString);
Matt Hinze
fonte
2

Use o método .Replace ()

Line.Replace("\n", "whatever you want to replace with");
The.Anti.9
fonte
2

A melhor maneira de substituir com segurança as quebras de linha é

yourString.Replace("\r\n","\n") //handling windows linebreaks
.Replace("\r","\n")             //handling mac linebreaks

que deve produzir uma string com apenas \ n (por exemplo, avanço de linha) como quebras de linha. esse código também é útil para corrigir quebras de linha mistas.

dados
fonte
2

Como a nova linha pode ser delimitada por \n, \re \r\n, primeiro, substituiremos \re \r\npor\n , e somente então dividiremos a sequência de dados.

As seguintes linhas devem ir para o parseCSVmétodo:

function parseCSV(data) {
    //alert(data);
    //replace UNIX new lines
    data = data.replace(/\r\n/g, "\n");
    //replace MAC new lines
    data = data.replace(/\r/g, "\n");
    //split into rows
    var rows = data.split("\n");
}
Amrik
fonte
0
string s = Regex.Replace(source_string, "\n", "\r\n");

ou

string s = Regex.Replace(source_string, "\r\n", "\n");

dependendo do caminho que você deseja seguir.

Espero que ajude.


fonte
0

Outra opção é criar uma StringReadersobreposição em questão. No leitor, faça .ReadLine()em um loop. Então você tem as linhas separadas, independentemente dos separadores (consistentes ou inconsistentes) que eles tinham. Com isso, você pode proceder como desejar; uma possibilidade é usar um StringBuildere chamar.AppendLine -lo.

A vantagem é que você deixa a estrutura decidir o que constitui uma "quebra de linha".

Jeppe Stig Nielsen
fonte
0

Se você deseja substituir apenas as novas linhas:

var input = @"sdfhlu \r\n sdkuidfs\r\ndfgdgfd";
var match = @"[\\ ]+";
var replaceWith = " ";
Console.WriteLine("input: " + input);
var x = Regex.Replace(input.Replace(@"\n", replaceWith).Replace(@"\r", replaceWith), match, replaceWith);
Console.WriteLine("output: " + x);

Se você deseja substituir novas linhas, guias e espaços em branco:

var input = @"sdfhlusdkuidfs\r\ndfgdgfd";
var match = @"[\\s]+";
var replaceWith = "";
Console.WriteLine("input: " + input);
var x = Regex.Replace(input, match, replaceWith);
Console.WriteLine("output: " + x);
Tadej
fonte