Powiedz nam więcej: czym jest dla Ciebie „przełamanie linii”? Czym chcesz je zastąpić?
Jay Bazuzi
ha ha. Sprawdzałem to samo dla java, kiedy dowiedziałem się, że System.getProperty („line.separator”) był ciekawym odpowiednikiem w języku C #. twój post pomógł mi.
myString = myString.Replace(System.Environment.NewLine,"replacement text");//add a line terminating ;
Jak wspomniano w innych postach, jeśli ciąg pochodzi z innego środowiska (OS), należy zastąpić implementację nowych znaków kontrolnych wiersza w tym środowisku .
Po pierwsze, nie działało to dla mnie. Po kilku badaniach znalazłem rozwiązanie: musiałem użyć „using System”; lub „System.Environment.NewLine”
Smolla
12
Nie usunięto wszystkich znaków nowej linii. Wypróbuj ten ciąg „\ n \ r \ nTo jest moja wiadomość \ r \ n \ n \ r \ n. \ N \ n \ r \ n”
Shakti Prakash Singh
13
Ogólnie podoba mi się to rozwiązanie. Należy jednak pamiętać, że nawet w tym samym systemie operacyjnym rzeczywiste znaki nowej linii mogą się nie zgadzać. Zdarzyło mi się, dlaczego przetwarzanie zwróciło SQL. Nowe linie to \ n, podczas gdy Environment.NewLine to \ r \ n. W rezultacie nic nie zostało dopasowane, więc nowe linie pozostały.
Dono
@Dono> skąd pochodzą dane SQL? Prawdopodobnie ze źródła zewnętrznego zajmującego się nowymi liniami w sposób uniksowy. To jest problem z formatem danych, nie z systemem operacyjnym ani z tą metodą ...
Laurent S.
Powinna to być jedna z metod statycznych klasy String. Sam .NET powinien być w stanie wykryć format podziałów linii źródłowej w ciągu znaków i przekonwertować go na format Environment.NewLine \ r \ n ...
Dean Kuga
442
Rozwiązania opublikowane do tej pory albo tylko zastępują, Environment.NewLinealbo zawodzą, jeśli ciąg zastępujący zawiera podziały wiersza, ponieważ wywołują string.Replacewiele razy.
Oto rozwiązanie, które wykorzystuje wyrażenie regularne do wykonania wszystkich trzech zamian w jednym przejściu ciągu. Oznacza to, że ciąg zastępujący może bezpiecznie zawierać podziały linii.
string result =Regex.Replace(input,@"\r\n?|\n", replacementString);
więc twoje powiedzenie wykonując Regex.Replace (input, @ "[\ r \ n] +", replaceString) nie wykonałoby tego samego zadania?
flamebaud
7
@flamebaud Nie, to dałoby inny wynik, jeśli istnieje wiele podziałów linii w rzędzie. „\ r \ n? | \ n” zastąpi każdy podział linii, podczas gdy „[\ r \ n] +” wykona pojedyncze zastąpienie dowolnej liczby podziałów linii.
David Hammond
Dla tych, którzy martwią się wieloma przerwami w linii: / (\ r \ n? | \ N) / gm
BobbyA
4
Jest to właściwie prawidłowe rozwiązanie, jeśli chcesz usunąć podział linii w ciągu, który może pochodzić z innego systemu operacyjnego. Dobrym przykładem jest formatowanie JSON. +1
Bastien Vandamme
1
Jeśli nie zostanie użyty pełny ciąg (przedrostek @), musisz mieć dwa ukośniki w wierszu wszędzie tam, gdzie jest używany, więc odpowiedź @mark_byers powyżej jest nadal poprawna. Prefiks @ sprawia, że ukośnik odwrotny jest częścią ciągu, którym musi być Regex, aby używał go jako znaku zmiany znaczenia.
Kirk Liemohn,
173
Aby rozszerzyć odpowiedź The.Anyi.9, powinieneś również zdawać sobie sprawę z różnych typów ogólnego łamania linii . W zależności od tego, skąd pochodzi Twój plik, możesz sprawdzić, czy złapałeś wszystkie alternatywy ...
@ShawnDotey nie trzeba, chcemy zastąpić znaki kontrolne, a nie sekwencje odwrotnego ukośnika i litery.
N. Kudryavtsev
38
Chciałbym użyć Environment.Newline, gdy chciałem wstawić nowy wiersz dla ciągu, ale nie do usunięcia wszystkich nowych wierszy z ciągu.
W zależności od platformy możesz mieć różne typy znaków nowej linii, ale nawet na tej samej platformie często stosuje się różne rodzaje znaków nowej linii. W szczególności w przypadku formatów plików i protokołów.
Jest to jedyna rzecz, która działała dla mnie, gdy chciałem zwinąć pobrany kod strony internetowej w jednym wierszu (aby ułatwić wzorce wyrażeń regularnych).
Paw Baltzersen,
Całkowicie zgadzam się z Brianem R. Bondy. Rozwiązanie oferowane przez Corina i tak wysoko ocenione jest przynajmniej bardzo naiwne.
Califf
18
Jeśli twój kod ma działać w różnych środowiskach, rozważyłbym użycie Environment.NewLinestałej, ponieważ jest ona specyficznie newlineużywana w określonym środowisku.
line = line.Replace(Environment.NewLine,"newLineReplacement");
Jeśli jednak otrzymujesz tekst z pliku pochodzącego z innego systemu, może to nie być poprawna odpowiedź i powinieneś zastąpić dowolną stałą nowego wiersza używaną w innym systemie. Zazwyczaj będzie to \nlub \r\n.
Musisz ponownie przypisać ją do oryginalnej zmiennej, ponieważ zamiana nie występuje na miejscu.
tvanfosson
@driss Chciałbym wiedzieć, jak wybrać właściwą nową stałą linii, gdy nie masz pojęcia, z jakiego systemu pochodzi plik ... to rozwiązanie naprawdę wydaje się UNIWERSALNE.
Califf
14
Nie zapominaj, że replace nie wykonuje zamiany w ciągu, ale zwraca nowy ciąg z zastąpionymi znakami. Poniższe spowoduje usunięcie podziałów linii (nie zastąpi ich). Użyłbym metody @Briana R. Bondy'ego, jeśli zastąpiłbym je czymś innym, być może opakowanym jako metoda rozszerzenia. Pamiętaj, aby najpierw sprawdzić wartości zerowe przed wywołaniem funkcji Replace lub podanych metod rozszerzenia.
string line =...
line = line.Replace("\r","").Replace("\n","");
nie mogę mieć ''w C # - nie ma czegoś takiego jak pusty znak. będzie '\0'działać zamiast tego?
Shevek
1
@ Shevek - po prostu użyłem niewłaściwych cytatów. Musiałem robić sporo javascript w dniu, w którym odpowiedziałem na to.
tvanfosson
@Califf - jest równoważny, a nie lepszy.
tvanfosson
2
błąd, który popełniłeś tutaj, dowodzi, że JEST lepszy. Większość firm, dla których pracowałem, ma swój standard kodowania - NIE UŻYWAJ LITERALI HARDCODED.
Califf
2
@Califf „błąd”, który popełniłem, nie zostałby popełniony w środowisku IDE z Intellisense ani nie zostałby skompilowany. Jeśli uważasz, że string.Emptyjest to lepsze, skorzystaj z niego.
tvanfosson
10
Aby upewnić się, że wszystkie możliwe sposoby podziału linii (Windows, Mac i Unix) zostały zastąpione, należy użyć:
Jako nowej linii może być ograniczona \n, \ra \r\nprzede będziemy wymieniać \ri \r\nz \n, a dopiero potem podzielonego ciąg danych.
Do parseCSVmetody powinny przejść następujące wiersze :
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 rowsvar rows = data.split("\n");}
Inną opcją jest utworzenie danego StringReaderciągu znaków. Na czytniku rób .ReadLine()w pętli. Następnie rozdzielamy linie, bez względu na to, jakie separatory (spójne lub niespójne) miały. Dzięki temu możesz kontynuować, jak chcesz; jedną z możliwości jest użycie StringBuilderi wywołanie .AppendLinego.
Zaletą jest to, że pozwalasz ramie decydować, co stanowi „podział linii”.
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);
Jeśli chcesz zastąpić znaki nowej linii, tabulatory i białe znaki:
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);
Odpowiedzi:
Użyj zamień na
Environment.NewLine
Jak wspomniano w innych postach, jeśli ciąg pochodzi z innego środowiska (OS), należy zastąpić implementację nowych znaków kontrolnych wiersza w tym środowisku .
źródło
Rozwiązania opublikowane do tej pory albo tylko zastępują,
Environment.NewLine
albo zawodzą, jeśli ciąg zastępujący zawiera podziały wiersza, ponieważ wywołująstring.Replace
wiele razy.Oto rozwiązanie, które wykorzystuje wyrażenie regularne do wykonania wszystkich trzech zamian w jednym przejściu ciągu. Oznacza to, że ciąg zastępujący może bezpiecznie zawierać podziały linii.
źródło
Aby rozszerzyć odpowiedź The.Anyi.9, powinieneś również zdawać sobie sprawę z różnych typów ogólnego łamania linii . W zależności od tego, skąd pochodzi Twój plik, możesz sprawdzić, czy złapałeś wszystkie alternatywy ...
powinienem zacząć ...
źródło
Line.Replace("\n", replaceWith).Replace("\r", replaceWith);
wystarczy?\r\n
, skończysz z ciągiem zastępczym dwa razy - nie idealnie.Chciałbym użyć Environment.Newline, gdy chciałem wstawić nowy wiersz dla ciągu, ale nie do usunięcia wszystkich nowych wierszy z ciągu.
W zależności od platformy możesz mieć różne typy znaków nowej linii, ale nawet na tej samej platformie często stosuje się różne rodzaje znaków nowej linii. W szczególności w przypadku formatów plików i protokołów.
źródło
Jeśli twój kod ma działać w różnych środowiskach, rozważyłbym użycie
Environment.NewLine
stałej, ponieważ jest ona specyficznienewline
używana w określonym środowisku.Jeśli jednak otrzymujesz tekst z pliku pochodzącego z innego systemu, może to nie być poprawna odpowiedź i powinieneś zastąpić dowolną stałą nowego wiersza używaną w innym systemie. Zazwyczaj będzie to
\n
lub\r\n
.źródło
Nie zapominaj, że replace nie wykonuje zamiany w ciągu, ale zwraca nowy ciąg z zastąpionymi znakami. Poniższe spowoduje usunięcie podziałów linii (nie zastąpi ich). Użyłbym metody @Briana R. Bondy'ego, jeśli zastąpiłbym je czymś innym, być może opakowanym jako metoda rozszerzenia. Pamiętaj, aby najpierw sprawdzić wartości zerowe przed wywołaniem funkcji Replace lub podanych metod rozszerzenia.
Jako metody rozszerzenia:
źródło
''
w C # - nie ma czegoś takiego jak pusty znak. będzie'\0'
działać zamiast tego?string.Empty
jest to lepsze, skorzystaj z niego.Aby upewnić się, że wszystkie możliwe sposoby podziału linii (Windows, Mac i Unix) zostały zastąpione, należy użyć:
i w tej kolejności, aby nie robić dodatkowych podziałów linii, gdy znajdziesz jakąś kombinację znaków kończących linię.
źródło
jeśli chcesz „wyczyścić” nowe linie, najlepiej jest użyć komentarza Flameba przy użyciu wyrażenia regularnego
@"[\r\n]+"
.źródło
Musiałem zastąpić
\r\n
rzeczywistym znakiem powrotu karetki i przesunięciem wiersza i zastąpić\t
faktyczną tabulatorem. Więc wpadłem na następujące:źródło
Dlaczego nie oba?
Uwaga: Zamień
strin
na nazwę swojego ciągu wejściowego.źródło
źródło
Użyj metody .Replace ()
źródło
Najlepszym sposobem na bezpieczne zastąpienie łamania linii jest
które powinny generować ciąg z \ n (np. linefeed) jako podziałami linii. ten kod jest także przydatny do naprawy mieszanych podziałów linii.
źródło
Jako nowej linii może być ograniczona
\n
,\r
a\r\n
przede będziemy wymieniać\r
i\r\n
z\n
, a dopiero potem podzielonego ciąg danych.Do
parseCSV
metody powinny przejść następujące wiersze :źródło
lub
w zależności od tego, którą drogą chcesz iść.
Mam nadzieję, że to pomoże.
źródło
Inną opcją jest utworzenie danego
StringReader
ciągu znaków. Na czytniku rób.ReadLine()
w pętli. Następnie rozdzielamy linie, bez względu na to, jakie separatory (spójne lub niespójne) miały. Dzięki temu możesz kontynuować, jak chcesz; jedną z możliwości jest użycieStringBuilder
i wywołanie.AppendLine
go.Zaletą jest to, że pozwalasz ramie decydować, co stanowi „podział linii”.
źródło
Jeśli chcesz zastąpić tylko nowe linie:
Jeśli chcesz zastąpić znaki nowej linii, tabulatory i białe znaki:
źródło