Bagaimana cara menghapus karakter baris baru dari string?

181

Saya memiliki string dalam format berikut

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

Saya ingin menghapus semua kemunculan \ndan \rdari string di atas.

Saya sudah mencoba string s = s.Trim(new char[] {'\n', '\r'});tetapi tidak membantu.

Ashish Ashu
sumber

Jawaban:

321

Saya suka menggunakan ekspresi reguler. Dalam hal ini yang dapat Anda lakukan:

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

Ekspresi reguler tidak sepopuler di dunia .NET seperti pada bahasa dinamis, tetapi mereka memberikan banyak kekuatan untuk memanipulasi string.

Gereja
sumber
Ini jelas merupakan solusi terbaik bagi saya. Perpaduan yang mulus dari C # dan javascript ini adalah semua yang saya butuhkan untuk menyelesaikan masalah saya.
Joe Brunscheon
Saya memiliki masalah serupa di mana saya perlu juga menghapus baris baru dari string saya. Saya mencoba melakukannya dengan string. Ganti, tidak berhasil. Ketika saya menggunakan Regex.Replace dengan string ekspresi reguler yang sama persis dengan parameter, itu berhasil. Terima kasih.
instance of
8
Hati-hati jika menggunakan ini dalam satu lingkaran yang memproses item 1M +. Regex jauh lebih lambat dari sekadar String. Ganti
Nick
Contoh kode juga menghapus tab \ t, yang tidak dipertanyakan.
Michael Freidgeim
71

Anda ingin menggunakan String.Replaceuntuk menghapus karakter.

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

Perhatikan bahwa String.Trim(params char[] trimChars)hanya menghapus karakter depan dan belakang trimCharsdari instance yang dipanggil.

Anda bisa membuat metode ekstensi, yang menghindari masalah kinerja di atas membuat banyak string sementara:

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();
}
jason
sumber
8
Perhatikan bahwa pendekatan ini akan membuat dua objek string perantara. Bergantung pada ukuran string Anda, ini dapat memiliki konsekuensi kinerja dan konsumsi memori yang signifikan.
cdhowie
40

Saya tahu ini adalah posting lama, namun saya pikir saya akan membagikan metode yang saya gunakan untuk menghapus karakter baris baru.

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

Referensi:

String MSDN. Metode Ganti dan Lingkungan MSDN. Properti Baru

ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
sumber
bagus untuk dukungan Mono
Nick
1
Dalam lintas lingkungan (yaitu aplikasi Windows yang diumpankan dengan data dari sistem Unix) aplikasi ini akan menyebabkan lebih banyak masalah daripada keuntungan.
Jakub Szułakiewicz
15

Jika kecepatan dan penggunaan memori rendah penting, lakukan sesuatu seperti ini:

var sb = new StringBuilder(s.Length);

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

s = sb.ToString();
cdhowie
sumber
Ya, saya juga akan menggunakan ini (dalam metode ekstensi). Selalu bagus untuk menggunakan StringBuilder. +1
RPM1984
4
"Selalu bagus menggunakan StringBuilder" <Aku bukan pro, tapi itu tidak sepenuhnya benar. Artikel ini oleh Jeff Atwood memberikan wawasan yang menyenangkan ke dalam manipulasi string / penggabungan dan akhirnya, optimasi.
Phil Cooper
5

lakukan saja itu

s = s.Replace("\n", String.Empty).Replace("\t", String.Empty).Replace("\r", String.Empty);
Mahmoud ElMansy
sumber
3

Pendekatan 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'));
wb
sumber
1
Ini menggunakan overload generik string.Joinyang akan memanggil ToStringsetiap chardikembalikan oleh kueri. Lebih baik hanya meneruskan hasil permintaan ke stringkonstruktor. s1 = new string(s.Where(....).ToArrary());
juharr
0

Pilihan yang tepat sangat tergantung pada seberapa besar string input dan apa kebutuhan daya dan memori, tapi saya akan menggunakan ekspresi reguler seperti

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

Atau jika kita perlu menerapkan penggantian yang sama beberapa kali, lebih baik menggunakan versi yang dikompilasi untuk Regex like

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

CATATAN: skenario yang berbeda membutuhkan pendekatan yang berbeda untuk mencapai kinerja terbaik dan konsumsi memori minimum

kalitsov
sumber
0

Baiklah ... Saya ingin Anda memahami area ruang yang lebih spesifik. \tsebenarnya bermacam-macam sebagai ruang horisontal, bukan ruang vertikal. (uji memasukkan\t Notepad)

Jika Anda menggunakan Java, cukup gunakan \v. Lihat referensi di bawah ini.

\h - Karakter spasi putih horisontal:

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

\v - Karakter spasi putih vertikal:

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

Tapi saya sadar Anda menggunakan .NET. Jadi jawaban saya untuk mengganti setiap ruang vertikal adalah ..

string replacement = Regex.Replace(s, @"[\n\u000B\u000C\r\u0085\u2028\u2029]", "");
Kang Andrew
sumber
Sepertinya jawaban untuk beberapa pertanyaan lain ... dan juga kehilangan referensi aktual ...
Alexei Levenkov
-4

Anda dapat menggunakan Trimjika Anda ingin menghapus dari awal dan akhir.

string stringWithoutNewLine = "\n\nHello\n\n".Trim();
Ankit Arya
sumber
-6

FYI,

Trim () sudah melakukannya.

Contoh LINQPad berikut:

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

Output:

23
18
lnaie
sumber
5
Itu tidak menghapus \ n di tengah.
FlappySocks