Como remover novos caracteres de linha de uma string?


181

Eu tenho uma string no seguinte formato

string s = "This is a Test String.\n   This is a next line.\t This is a tab.\n'

Quero remover todas as ocorrências de \ne \rda string acima.

Eu tentei, string s = s.Trim(new char[] {'\n', '\r'});mas não ajudou.

Respostas:


321

Eu gosto de usar expressões regulares. Nesse caso, você pode fazer:

string replacement = Regex.Replace(s, @"\t|\n|\r", "");

Expressões regulares não são tão populares no mundo .NET quanto nas linguagens dinâmicas, mas fornecem muito poder para manipular seqüências de caracteres.


Essa foi definitivamente a melhor solução para mim. Tudo o que eu precisava era de uma mistura suave desse c # e javascript para resolver meu problema.
Joe Brunscheon

Eu tive um problema semelhante, onde também precisava remover novas linhas da minha string. Tentei fazê-lo com string.Replace, não funcionou. Quando usei o Regex.Replace com a mesma string de expressão regular exata que o parâmetro, ele funcionou. Obrigado.
instância

8
Cuidado ao usar isso em um loop que processa itens de 1 milhão ou mais. Regex é a maneira mais lenta do que apenas String.Replace
Nick

O exemplo de código também remove as guias \ t, o que não está em questão.
Michael Freidgeim 20/08/19

71

Você deseja usar String.Replacepara remover um personagem.

s = s.Replace("\n", String.Empty);
s = s.Replace("\r", String.Empty);
s = s.Replace("\t", String.Empty);

Observe que String.Trim(params char[] trimChars)somente os caracteres iniciais e finais são removidos trimCharsda instância invocada em.

Você pode criar um método de extensão, que evita os problemas de desempenho acima de criar muitas seqüências temporárias:

static string RemoveChars(this string s, params char[] removeChars) {
    Contract.Requires<ArgumentNullException>(s != null);
    Contract.Requires<ArgumentNullException>(removeChars != null);
    var sb = new StringBuilder(s.Length);
    foreach(char c in s) { 
        if(!removeChars.Contains(c)) {
            sb.Append(c);
        }
    }
    return sb.ToString();
}

8
Observe que essa abordagem criará dois objetos de cadeia intermediária. Dependendo do tamanho da sua sequência, isso pode ter consequências significativas no desempenho e no consumo de memória.
Cdwrie #

40

Sei que essa é uma postagem antiga, mas pensei em compartilhar o método usado para remover novos caracteres de linha.

s.Replace(Environment.NewLine, "");

Referências:

Método String.Replace do MSDN e Propriedade Environment.NewLine do MSDN


agradável para apoio Mono
Nick

1
Em aplicativos de ambiente cruzado (por exemplo, aplicativo do Windows que é alimentado com dados do sistema Unix), isso causa mais problemas do que lucros.
Jakub Szułakiewicz 17/06/19

15

Se a velocidade e o baixo uso de memória forem importantes, faça algo assim:

var sb = new StringBuilder(s.Length);

foreach (char i in s)
    if (i != '\n' && i != '\r' && i != '\t')
        sb.Append(i);

s = sb.ToString();

Sim, eu também aceitaria isso (em um método de extensão). Sempre bom usar o StringBuilder. 1
RPM1984

4
"Sempre bom usar o StringBuilder" <Não sou profissional, mas isso não é verdade. Este artigo de Jeff Atwood fornece uma visão divertida sobre manipulação / concatenação de strings e, finalmente, otimização.
Phil Cooper

5

apenas faça isso

s = s.Replace("\n", String.Empty).Replace("\t", String.Empty).Replace("\r", String.Empty);

3

Uma abordagem LINQ:

string s = "This is a Test String.\n   This is a next line.\t This is a tab.\n'";

string s1 = String.Join("", s.Where(c => c != '\n' && c != '\r' && c != '\t'));

1
Isso está usando a sobrecarga genérica string.Joinque chamará ToStringcada um charretornado pela consulta. Melhor apenas passar os resultados da consulta para o stringconstrutor. s1 = new string(s.Where(....).ToArrary());
juharr

0

A escolha certa realmente depende do tamanho da string de entrada e de quais requisitos de força e memória, mas eu usaria uma expressão regular como

string result = Regex.Replace(s, @"\r\n?|\n|\t", String.Empty);

Ou, se precisarmos aplicar a mesma substituição várias vezes, é melhor usar uma versão compilada para o Regex como

var regex = new Regex(@"\r\n?|\n|\t", RegexOptions.Compiled); 
string result = regex.Replace(s, String.Empty);

NOTA: cenários diferentes requerem abordagens diferentes para obter o melhor desempenho e o consumo mínimo de memória


0

Bem ... eu gostaria que você entendesse áreas mais específicas do espaço. \té realmente sortido como um espaço horizontal, não um espaço vertical. (teste a inserção \tno bloco de notas)

Se você usa Java, basta usar \v. Veja a referência abaixo.

\h - Um caractere de espaço em branco horizontal:

[\t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]

\v - Um caractere de espaço em branco vertical:

[\n\x0B\f\r\x85\u2028\u2029]

Mas estou ciente de que você usa o .NET. Então, minha resposta para substituir todos os espaços verticais é ..

string replacement = Regex.Replace(s, @"[\n\u000B\u000C\r\u0085\u2028\u2029]", "");

Parece que uma resposta para alguma outra questão ... e também faltando referência real ...
Alexei Levenkov

-4

Você pode usar Trimse quiser remover do início e do fim.

string stringWithoutNewLine = "\n\nHello\n\n".Trim();

-6

PARA SUA INFORMAÇÃO,

Trim () já faz isso.

O seguinte exemplo LINQPad:

void Main()
{
    var s = " \rsdsdsdsd\nsadasdasd\r\n ";
    s.Length.Dump();
    s.Trim().Length.Dump();
}

Saídas:

23
18

5
Isso não remove o \ n no meio.
FlappySocks
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.