Ganti Line Breaks dalam String C #

512

Bagaimana saya bisa mengganti Line Breaks dalam string di C #?

YonahW
sumber
2
Tolong beri tahu kami lebih lanjut: apa yang dimaksud dengan "jeda baris" bagi Anda? Anda ingin menggantinya dengan apa?
Jay Bazuzi
ha ha. Saya sedang mengecek hal yang sama untuk di java ketika saya menemukan System.getProperty ("line.separator") ingin mengetahui rekan di C #. posting Anda membantu saya.
Ravisha

Jawaban:

715

Gunakan ganti dengan Environment.NewLine

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

Seperti disebutkan dalam posting lain, jika string berasal dari lingkungan lain (OS) maka Anda harus mengganti lingkungan tertentu yang menerapkan karakter kontrol baris baru .

Corin Blaikie
sumber
8
Pertama tidak bekerja untuk saya. Setelah beberapa penelitian, saya menemukan solusinya: Saya harus menggunakan 'using System;' atau 'System.Environment.NewLine'
Smolla
12
Tidak menghapus semua karakter baris baru. Coba string ini "\ n \ r \ nPesan saya \ r \ n \ n \ r \ n adalah ini. \ N \ n \ r \ n"
Shakti Prakash Singh
13
Secara umum, saya suka solusi ini. Namun, perlu dicatat bahwa bahkan pada OS yang sama, baris baru yang sebenarnya mungkin tidak cocok. Ini terjadi pada saya mengapa pemrosesan kembali SQL. Baris baru adalah \ n, sedangkan Environment.NewLine adalah \ r \ n. Hasilnya adalah tidak ada yang cocok sehingga baris baru tetap.
Dono
@Lakukan> di mana data SQL berasal? Mungkin dari sumber luar yang berurusan dengan jalur baru dengan cara UNIX. Itu masalah dengan format data, bukan dengan OS atau metode ini ...
Laurent S.
Ini harus menjadi salah satu metode statis dari kelas String. .NET itu sendiri harus dapat mendeteksi format jeda baris sumber dalam sebuah string dan mengubahnya menjadi format Environment.NewLine \ r \ n ...
Dean Kuga
442

Solusi yang diposting sejauh ini hanya penggantian Environment.NewLineatau gagal jika string pengganti berisi jeda baris karena mereka memanggil string.Replacebeberapa kali.

Inilah solusi yang menggunakan ekspresi reguler untuk membuat ketiga penggantian hanya dalam satu kali melewati string. Ini berarti bahwa string pengganti dapat dengan aman mengandung jeda baris.

string result = Regex.Replace(input, @"\r\n?|\n", replacementString);
Mark Byers
sumber
3
jadi pepatah Anda melakukan Regex.Replace (input, @ "[\ r \ n] +", replacementString) tidak akan menyelesaikan tugas yang sama?
flamebaud
7
@flamebaud Tidak, itu akan menghasilkan hasil yang berbeda jika ada beberapa jeda baris berturut-turut. "\ r \ n? | \ n" akan mengganti setiap jeda baris sementara "[\ r \ n] +" akan melakukan penggantian tunggal untuk sejumlah jeda baris.
David Hammond
Bagi mereka yang khawatir tentang beberapa jeda baris: / (\ r \ n? | \ N) / gm
BobbyA
4
Ini sebenarnya solusi yang tepat jika Anda ingin menghapus jeda baris dalam string yang mungkin berasal dari OS yang berbeda. Contoh yang bagus adalah pemformatan JSON. +1
Bastien Vandamme
1
Jika string kata demi kata (@ awalan) tidak digunakan, maka Anda harus memiliki dua garis miring terbalik di mana-mana ia digunakan, sehingga jawaban oleh @mark_byers di atas masih benar. Awalan @ membuatnya sehingga backslash adalah bagian dari string yang harus digunakan Regex sebagai karakter pelarian.
Kirk Liemohn
173

Untuk memperluas jawaban The.Anyi.9, Anda juga harus mengetahui berbagai jenis pemisah jalur yang umum digunakan . Bergantung di mana file Anda berasal, Anda mungkin ingin melihat memastikan Anda menangkap semua alternatif ...

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

harus membuat Anda pergi ...

ZombieSheep
sumber
6
Pertama saya suka lingkungan thingi lebih baik, tetapi jika String tidak berasal dari sistem yang berjalan, itu tidak akan berfungsi. +1
Flo
1
tidak Line.Replace("\n", replaceWith).Replace("\r", replaceWith);cukup?
Thomas Ayoub
5
Tidak, karena jika Anda memilikinya, \r\nAnda akan mendapatkan string pengganti dua kali - tidak ideal.
ZombieSheep
1
Apakah Anda tidak membutuhkan string literal? string RemoveBreaks = Line.Replace (@ "\ r \ n", replaceWith) .Replace (@ "\ n", replaceWith) .Replace (@ "\ r", replaceWith);
Shawn Dotey
2
@ShawnDotey tidak perlu, kami ingin mengganti karakter kontrol, bukan urutan backslash dan huruf.
N. Kudryavtsev
38

Saya akan menggunakan Environment.Newline ketika saya ingin memasukkan baris baru untuk sebuah string, tetapi tidak untuk menghapus semua baris baru dari sebuah string.

Tergantung pada platform Anda, Anda dapat memiliki berbagai jenis baris baru, tetapi bahkan di dalam platform yang sama sering kali berbagai jenis baris baru digunakan. Khususnya ketika berhadapan dengan format file dan protokol.

string ReplaceNewlines(string blockOfText, string replaceWith)
{
    return blockOfText.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);
}
Brian R. Bondy
sumber
Ini adalah satu-satunya hal yang bekerja untuk saya ketika saya ingin menutup kode halaman web yang diambil ke satu baris (untuk membuat pola regex lebih mudah).
Paw Baltzersen
Sepenuhnya setuju dengan Brian R. Bondy. Solusi yang ditawarkan oleh Corin dan begitu banyak dipilih sangat naif, setidaknya.
Califf
18

Jika kode Anda seharusnya dijalankan di lingkungan yang berbeda, saya akan mempertimbangkan untuk menggunakan Environment.NewLinekonstanta, karena secara khusus newlinedigunakan di lingkungan spesifik.

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

Namun, jika Anda mendapatkan teks dari file yang berasal dari sistem lain, ini mungkin bukan jawaban yang benar, dan Anda harus mengganti dengan konstanta baris baru apa pun yang digunakan pada sistem lain. Biasanya akan \natau \r\n.

driis
sumber
Anda perlu menugaskan kembali ke variabel asli karena penggantian tidak terjadi.
tvanfosson
@driss Saya ingin tahu bagaimana Anda memilih konstanta baris baru yang benar ketika Anda tidak tahu dari mana sistem file berasal ... solusi ini tampaknya benar-benar UNIVERSAL.
Califf
14

Jangan lupa bahwa penggantian tidak melakukan penggantian dalam string, tetapi mengembalikan string baru dengan karakter yang diganti. Berikut ini akan menghapus jeda baris (bukan menggantikannya). Saya akan menggunakan metode @Brian R. Bondy jika menggantinya dengan sesuatu yang lain, mungkin dibungkus sebagai metode ekstensi. Ingatlah untuk memeriksa nilai nol terlebih dahulu sebelum memanggil Ganti atau metode ekstensi yang disediakan.

string line = ...

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

Sebagai metode ekstensi:

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
sumber
tidak bisa ada ''di C # - tidak ada yang namanya char kosong. apakah akan '\0'bekerja?
Shevek
1
@Shevek - hanya menggunakan kutipan yang salah. Pasti telah melakukan cukup banyak javascript pada hari saya menjawab ini.
tvanfosson
@ Califf - itu setara, tidak lebih baik.
tvanfosson
2
kesalahan yang Anda buat di sini membuktikan bahwa itu lebih baik. Sebagian besar perusahaan tempat saya bekerja memiliki standar pengkodean - JANGAN MENGGUNAKAN LITERAL HARDCODED.
Califf
2
@ Califf "kesalahan" yang saya buat tidak akan dibuat dalam IDE dengan Intellisense juga tidak akan dikompilasi. Jika Anda merasa itu string.Emptylebih baik, gunakan saja.
tvanfosson
10

Untuk memastikan semua kemungkinan cara pemutusan saluran (Windows, Mac dan Unix) diganti, Anda harus menggunakan:

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

dan dalam urutan ini, untuk tidak membuat jeda baris tambahan, ketika Anda menemukan beberapa kombinasi karakter garis akhir.

Dominik Szymański
sumber
8

jika Anda ingin "membersihkan" baris baru, komentar flamebaud menggunakan regex @"[\r\n]+"adalah pilihan terbaik.

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
sumber
Jawaban terbaik untuk mengganti baris baru, untuk sebagian besar kasus.
Shahbaz Ahmad
Terima kasih atas kode contoh yang bermanfaat ini. Saya diperbaiki melalui sytnax ini: Regex.Replace (str, @ "[\ r \ n] +", "-")
Sedat Kumcu
6

Saya perlu mengganti \r\ndengan carriage return dan line feed \tyang sebenarnya dan ganti dengan tab yang sebenarnya. Jadi saya datang dengan yang berikut:

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
sumber
6

Mengapa tidak keduanya?

string ReplacementString = "";

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

Catatan: Gantistrin dengan nama string input Anda.

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

Gunakan metode .Replace ()

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

Cara terbaik untuk mengganti linebreak dengan aman adalah

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

yang seharusnya menghasilkan string dengan hanya \ n (mis. linefeed) sebagai linebreak. kode ini juga berguna untuk memperbaiki linebreak campuran.

data
sumber
2

Karena baris baru dapat dibatasi oleh \n, \rdan \r\n, pertama kita akan mengganti \rdan \r\ndengan\n , dan hanya kemudian membagi string data.

Baris berikut harus menuju ke parseCSVmetode:

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
sumber
0
string s = Regex.Replace(source_string, "\n", "\r\n");

atau

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

tergantung ke arah mana Anda ingin pergi.

Semoga ini bisa membantu.


sumber
0

Pilihan lain adalah membuat StringReaderover the string yang dimaksud. Pada pembaca, lakukan .ReadLine()dalam satu lingkaran. Maka Anda memiliki garis yang dipisahkan, tidak peduli apa (yang konsisten atau tidak konsisten) pemisah yang mereka miliki. Dengan itu, Anda dapat melanjutkan sesuai keinginan; satu kemungkinan adalah menggunakan a StringBuilderdan menelepon.AppendLine .

Keuntungannya adalah, Anda membiarkan kerangka memutuskan apa yang merupakan "jeda baris".

Jeppe Stig Nielsen
sumber
0

Jika Anda hanya ingin mengganti baris baru:

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);

Jika Anda ingin mengganti baris baru, tab, dan spasi putih:

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
sumber