Bir Dizedeki Satır Sonlarını Değiştirme C #


512

C # 'da bir dize içindeki Satır Sonlarını nasıl değiştirebilirim?


2
Lütfen bize daha fazla bilgi verin: Size "satır sonu" nedir? Bunların yerine ne koymak istiyorsunuz?
Jay Bazuzi

ha. ben System.getProperty ("line.separator") C # muadili bilmek merak olduğunu öğrendim aynı java için kontrol ediyordu. yayının bana yardımcı oldu.
Ravisha

Yanıtlar:


715

Değiştir ile kullan Environment.NewLine

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

Diğer gönderilerde de belirtildiği gibi, dize başka bir ortamdan (OS) geliyorsa, o belirli ortamların yeni satır kontrol karakterlerinin uygulanmasını değiştirmeniz gerekir .


8
İlk olarak benim için işe yaramadı. Biraz araştırma yaptıktan sonra çözümü buldum: 'Sistem kullanarak' kullanmak zorunda kaldım; veya 'System.Environment.NewLine'
Smolla

12
Tüm yeni satır karakterlerini kaldırmadım. Bu dizeyi deneyin "\ n \ r \ nMesajım \ r \ n \ n \ r \ n bu. \ N \ n \ r \ n"
Shakti Prakash Singh

13
Genel olarak, bu çözümü seviyorum. Ancak, aynı işletim sisteminde bile, gerçek satırların eşleşmeyebileceğini unutmayın. Bu bana işlemenin neden SQL döndürdüğünü gösterdi. Yeni satırlar \ n iken, Environment.NewLine \ r \ n idi. Sonuçta hiçbir şey eşleşmediği için yeni hatlar kaldı.
Dono

@Dono> SQL verileri nereden geliyor? Muhtemelen dışarıdaki bir kaynaktan yeni hatlarla UNIX yolu ile ilgileniyor. Bu veri formatı ile ilgili bir sorun, işletim sistemi veya bu yöntemle değil ...
Laurent S.

Bu, String sınıfının statik yöntemlerinden biri olmalıdır. .NET'in kendisi, bir dizede kaynak satırı kesmelerinin biçimini algılayabilmeli ve bunu
Dean Kuga

442

Şimdiye kadar gönderilen çözümler ya yalnızca değiştirilir Environment.NewLineya da değiştirilen dize, string.Replacebirden çok kez çağırdıkları için satır kesmeleri içeriyorsa başarısız olur .

Burada, üç değiştirmenin tümünü dizenin üzerinden tek bir geçişte yapmak için normal bir ifade kullanan bir çözüm var. Bu, değiştirme dizesinin güvenli bir şekilde satır kesmeleri içerebileceği anlamına gelir.

string result = Regex.Replace(input, @"\r\n?|\n", replacementString);

3
yani Regex.Replace (giriş, @ "[\ r \ n] +", replacementString) 'i söylediğiniz aynı görevi gerçekleştiremez mi?
flamebaud

7
@flamebaud Hayır, art arda birden fazla satır kesilmesi farklı bir sonuç verir. "\ r \ n? | \ n" her satır kesmesinin yerini alırken, "[\ r \ n] +" herhangi bir sayıda satır kesmesi için tek bir yer değiştirir.
David Hammond

Birden fazla satır sonu için endişelenenler için: / (\ r \ n? | \ N) / gm
BobbyA

4
Farklı işletim sistemlerinden gelebilecek bir dizede satır sonu kaldırmak istiyorsanız, bu aslında doğru çözümdür. JSON biçimlendirmesi iyi bir örnektir. +1
Bastien Vandamme

1
Aynen dize (@ öneki) kullanılmıyorsa, kullanıldığı her yerde arka arkaya iki ters eğik çizgi olması gerekir, bu nedenle yukarıdaki @mark_byers tarafından verilen yanıt hala doğrudur. @ Öneki, ters eğik çizginin Regex'in kaçış karakteri olarak kullanması için olması gereken dizenin bir parçası olmasını sağlar.
Kirk Liemohn

173

The.Anyi.9'un cevabını genişletmek için , genel kullanımda farklı hat kopması türlerinin de farkında olmalısınız . Dosyanızın nereden geldiğine bağlı olarak, tüm alternatifleri yakaladığınızdan emin olmak isteyebilirsiniz ...

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

gitmene izin vermeli ...


6
İlk olarak çevre thingi daha iyi sevdim, ama Dize üzerinde çalışan sistemden gelmezse, işe yaramaz. +1
Flo

1
değil Line.Replace("\n", replaceWith).Replace("\r", replaceWith);yeter?
Thomas Ayoub

5
Hayır, çünkü eğer varsa, \r\niki kez yedek dizeyle sonuçlanacaksınız - ideal değil.
ZombieSheep

1
Dizgi değişmezlerine ihtiyacınız yok mu? string removeBreaks = Line.Replace (@ "\ r \ n", replaceWith) .Replace (@ "\ n", replaceWith) .Replace (@ "\ r", replaceWith);
Shawn Dotey

2
@ShawnDotey gerek yok, kontrol karakterlerini değiştirmek istiyoruz, ters eğik çizgi ve harf dizilerini değil.
N. Kudryavtsev

38

Bir dize için bir yeni satır eklemek istediğimde, ancak bir dizeden tüm yeni satırları kaldırmak istemediğimde Environment.Newline'ı kullanırdım.

Platformunuza bağlı olarak farklı satırsonu türlerine sahip olabilirsiniz, ancak aynı platformun içinde bile genellikle farklı satırsonu türleri kullanılır. Özellikle dosya formatları ve protokolleri ile uğraşırken.

string ReplaceNewlines(string blockOfText, string replaceWith)
{
    return blockOfText.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);
}

Geri alınan bir web sayfası kodunu tek bir satıra (normal ifade kalıplarını kolaylaştırmak için) daraltmak istediğimde bu benim için çalışan tek şeydi.
Paw Baltzersen

Tamamen Brian R. Bondy ile hemfikir. Corin tarafından sunulan ve bu kadar ileri sürülen çözüm en azından çok naif.
Mart'ta Calif

18

Kodunuzun farklı ortamlarda çalışması gerekiyorsa , belirli bir ortamda Environment.NewLineözel olarak newlinekullanıldığı için sabiti kullanmayı düşünürüm.

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

Ancak, metni başka bir sistemden kaynaklanan bir dosyadan alırsanız, bu doğru yanıt olmayabilir ve diğer sistemde kullanılan yeni satır sabitiyle değiştirmelisiniz. Genellikle \nveya olacaktır \r\n.


Değiştirme yerine gelmediği için orijinal değişkene yeniden atamanız gerekir.
tvanfosson

@driss Bir dosyanın hangi sistemden geldiğine dair bir fikriniz olmadığında doğru yeni bir hat sabitini nasıl seçeceğinizi bilmek istiyorum ... Bu çözüm gerçekten EVRENSEL gibi görünüyor.
Mart'ta

14

Değişimin dizede değiştirmeyi yapmadığını, ancak karakterlerin değiştirildiği yeni bir dizeyi döndürdüğünü unutmayın. Aşağıdakiler satır sonlarını kaldıracaktır (değiştirilmemelidir). @Brian R. Bondy'nin yöntemini, başka bir şeyle değiştiriyor olsaydım, belki de bir uzatma yöntemi olarak sarılırdım. Değiştir'i veya sağlanan uzantı yöntemlerini çağırmadan önce null değerleri kontrol etmeyi unutmayın.

string line = ...

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

Genişletme yöntemleri olarak:

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

''C # olamaz - boş bir karakter diye bir şey yoktur. olacak '\0'yerine işe?
Shevek

1
@Shevek - sadece yanlış alıntılar kullandı. Bunu cevapladığım gün adil miktarda javascript yapmalıydım.
tvanfosson

@Califf - eşdeğer, daha iyi değil.
tvanfosson

2
Burada yaptığınız hata sadece daha iyi olduğunu kanıtlıyor. Çalıştığım çoğu şirket kodlama standardına sahip - HARDCODED LITERALS KULLANMAYIN.
Califf

2
@Califf, yaptığım "hata", Intellisense ile bir IDE'de yapılmaz ve derlenmezdi. Bunun string.Emptydaha iyi olduğunu düşünüyorsanız, elbette kullanın.
tvanfosson

10

Tüm olası satır sonlarının (Windows, Mac ve Unix) değiştirildiğinden emin olmak için şunları kullanmalısınız:

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

ve bu sırada, satır sonu karakterlerinin bir kombinasyonunu bulduğunuzda ekstra satır sonları yapmamak.


8

yeni satırları "temizlemek" istiyorsanız, regex kullanarak flamebaud yorum @"[\r\n]+"en iyi seçimdir.

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
  }
}

Çoğu durumda, yeni hatların yerini almanın en iyi yanıtı.
Şahbaz Ahmad

Bu yararlı örnek kod için teşekkürler. Bu sistem aracılığıyla düzeltildim: Regex.Replace (str, @ "[\ r \ n] +", "-")
Sedat Kumcu

6

Ben değiştirmek için gerekli \r\ngerçek bir satır başı ve satır beslemesi ile ve değiştirme \tgerçek bir sekme ile. Bu yüzden aşağıdakileri buldum:

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

6

Neden ikisi de olmasın?

string ReplacementString = "";

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

Not:strin Giriş dizenizin adıyla değiştirin .


4
var answer = Regex.Replace(value, "(\n|\r)+", replacementString);

2

.Replace () yöntemini kullanın

Line.Replace("\n", "whatever you want to replace with");

2

Çizgi kabarcıklarını güvenli bir şekilde değiştirmenin en iyi yolu

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

satır sonu olarak yalnızca \ n (ör. satır besleme) olan bir dize üretmelidir. bu kod, karışık satır aralıklarını düzeltmek için de kullanışlıdır.


2

Yeni hat olarak ile sınırlanmış olabilir \n, \rve \r\nilk biz değiştiririz, \rve \r\nile\n , ve ancak o zaman bölünmüş veri dizesi.

Aşağıdaki satırlar parseCSVyönteme gitmelidir :

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

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

veya

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

Hangi yöne gitmek istediğinize bağlı olarak.

Umarım yardımcı olur.


0

Başka bir seçenek, söz StringReaderkonusu dizenin üzerinde bir over oluşturmaktır . Okuyucuda .ReadLine()bir döngü yapın. Ardından, (tutarlı veya tutarsız) ayırıcılara bakılmaksızın, satırları ayırırsınız. Bununla istediğiniz gibi devam edebilirsiniz; bir olasılık birStringBuilder ve.AppendLine .

Avantaj, çerçevenin neyin "satır sonu" nu oluşturduğuna karar vermesine izin vermenizdir.


0

Yalnızca yeni satırları değiştirmek istiyorsanız:

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

Yeni satırları, sekmeleri ve beyaz boşlukları değiştirmek istiyorsanız:

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