Bir dizeden yeni satır karakterleri nasıl kaldırılır?


181

Aşağıdaki biçimde bir dize var

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

Yukarıdaki dize \nve tüm oluşumları kaldırmak istiyorum \r.

Denedim string s = s.Trim(new char[] {'\n', '\r'});ama yardımcı olmadı.

Yanıtlar:


321

Düzenli ifadeler kullanmayı seviyorum. Bu durumda şunları yapabilirsiniz:

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

Normal ifadeler .NET dünyasında dinamik dillerde olduğu kadar popüler değildir, ancak dizeleri işlemek için çok fazla güç sağlarlar.


Bu kesinlikle benim için en iyi çözümdü. Bu C # ve javascript düzgün bir karışımı tüm sorunumu çözmek için gerekli oldu.
Joe Brunscheon

Ben de benim dizeden yeni satırları kaldırmak için gerekli benzer bir sorun vardı. Ben string ile yapmaya çalıştım. Yer, işe yaramadı. Ben parametre ile aynı normal ifade dizesi ile Regex.Replace kullandığımda, çalıştı. Teşekkürler.
instanceof

8
Bunu 1M + öğelerini işleyen bir döngüde kullanırken dikkatli olun. Regex, sadece String'den çok daha yavaş.
Nick

Kod örneği, söz konusu olmayan \ t sekmelerini de kaldırır.
Michael Freidgeim

71

String.ReplaceBir karakteri kaldırmak için kullanmak istiyorsunuz .

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

Not String.Trim(params char[] trimChars)sadece ön ve arka karakterleri siler trimChars, örneğin çağrılır den.

Çok sayıda geçici dizenin yapılmasının yukarıdaki performans sorunlarından kaçınan bir uzatma yöntemi yapabilirsiniz:

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
Bu yaklaşımın iki ara dize nesnesi oluşturacağını unutmayın. Dizenizin boyutuna bağlı olarak, bunun önemli performans ve bellek tüketimi sonuçları olabilir.
cdhowie

40

Bunun eski bir yazı olduğunu biliyorum, ancak yeni satır karakterlerini kaldırmak için kullandığım yöntemi paylaşacağımı düşündüm.

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

Referanslar:

MSDN String.Replace Yöntemi ve MSDN Environment.NewLine Özelliği


Mono desteği için güzel
Nick

1
Ortamlar arası (yani Unix sisteminden verilerle beslenen Windows uygulaması) uygulamasında bu, kârdan daha fazla soruna neden olacaktır.
Jakub Szułakiewicz

15

Hız ve düşük bellek kullanımı önemliyse, şöyle bir şey yapın:

var sb = new StringBuilder(s.Length);

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

s = sb.ToString();

Evet, ben de (bir uzantı yönteminde) giderdim. StringBuilder'ı kullanmak her zaman iyidir. +1
RPM1984

4
"StringBuilder kullanmak her zaman iyidir" <Ben profesyonel değilim, ama bu kesinlikle doğru değil. Jeff Atwood'un bu makalesi, dize manipülasyonu / birleştirme ve nihayetinde optimizasyon hakkında eğlenceli bir fikir vermektedir.
Phil Cooper

5

sadece bunu yap

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

3

LINQ yaklaşımı:

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
Bu sorgu tarafından döndürülen her string.Joinçağırır genel aşırı yük kullanıyor . Sorgu sonuçlarını yapıcıya iletmek daha iyidir . ToStringcharstrings1 = new string(s.Where(....).ToArrary());
juharr

0

Doğru seçim gerçekten giriş dizesinin ne kadar büyük olduğuna ve performans ve bellek gereksiniminin ne olduğuna bağlıdır, ancak normal bir ifade

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

Veya aynı değişikliği birden çok kez uygulamamız gerekirse, Regex için derlenmiş bir sürümü kullanmak daha iyidir.

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

NOT: Farklı senaryolar, en iyi performansı ve minimum bellek tüketimini elde etmek için farklı yaklaşımlar gerektirir


0

Şey ... Uzayın daha spesifik alanlarını anlamanızı istiyorum. \taslında dikey bir alan değil, yatay bir alan olarak çeşitlendirilir. ( \tNot Defteri'ne eklenmeyi test edin )

Java kullanıyorsanız, tuşunu kullanın \v. Aşağıdaki referansa bakın.

\h - Yatay boşluk karakteri:

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

\v - Dikey boşluk karakteri:

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

Ancak .NET kullandığınızın farkındayım. Bu yüzden her dikey boşluğu değiştirmeye cevabım ..

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

Başka bir soruya bir cevap gibi görünüyor ... ve aynı zamanda gerçek referansı eksik ...
Alexei Levenkov

-4

TrimBaşlangıçtan ve bitişten kaldırmak istiyorsanız kullanabilirsiniz .

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

-6

Bilginize,

Trim () bunu zaten yapıyor.

Aşağıdaki LINQPad örneği:

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

Çıktılar:

23
18

5
Ortadaki \ n kaldırılmaz.
FlappySocks
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.