Замена разрывов строк в строке C#

Как заменить разрывы строк в строке в C#?

Расскажите, пожалуйста, подробнее: что для вас «разрыв строки»? Чем вы хотите их заменить?

Jay Bazuzi 26.10.2008 16:55

ха-ха. Я проверял то же самое в java, когда обнаружил, что System.getProperty ("line.separator") любопытно узнать аналог в C#. твой пост мне помог.

Ravisha 29.09.2010 08:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
546
3
611 640
17
Перейти к ответу Данный вопрос помечен как решенный

Ответы 17

Используйте метод .Replace ()

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

Я бы использовал Environment.Newline, когда хотел вставить новую строку для строки, но не удалить все новые строки из строки.

В зависимости от вашей платформы у вас могут быть разные типы новых строк, но даже внутри одной и той же платформы часто используются разные типы новых строк. В частности, при работе с форматами файлов и протоколами.

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

Это единственное, что у меня сработало, когда я хотел свернуть полученный код веб-страницы в одну строку (для упрощения шаблонов регулярных выражений).

Paw Baltzersen 17.07.2011 23:09

Полностью согласен с Брайаном Р. Бонди. Решение, предложенное Корином и получившее столько голосов, по крайней мере, очень наивно.

Califf 30.03.2013 01:33

Чтобы расширить ответ The.Anyi.9, вы также должны знать о различные типы разрыва строки в общем использовании. В зависимости от того, где был создан ваш файл, вы можете убедиться, что уловили все альтернативы ...

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

должен заставить тебя идти ...

Сначала мне больше понравилась среда, но если строка не поступает из системы, в которой она работает, она не будет работать. +1

Flo 17.11.2011 14:21

Это решение сработало для меня, когда я попытался использовать его для замены новой строки в выводе PowerShell с C#. Заменить (System.Environment.NewLine, "") у меня сработало.

Ram 04.02.2013 07:27

недостаточно Line.Replace("\n", replaceWith).Replace("\r", replaceWith);?

Thomas Ayoub 22.07.2015 18:38

Нет, потому что, если у вас есть \r\n, вы получите заменяющую строку дважды - не идеально.

ZombieSheep 22.07.2015 20:02

Разве вам не нужны строковые литералы? string removeBreaks = Line.Replace (@ "\ r \ n", replaceWith) .Replace (@ "\ n", replaceWith) .Replace (@ "\ r", replaceWith);

Shawn Dotey 13.03.2017 16:42

@ShawnDotey в этом нет необходимости, мы хотим заменить управляющие символы, а не последовательности обратной косой черты и буквы.

N. Kudryavtsev 05.10.2018 13:31
Ответ принят как подходящий

Используйте заменить на Environment.NewLine

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

Как упоминалось в других сообщениях, если строка поступает из другой среды (ОС), вам необходимо заменить эту конкретную реализацию среды символы управления новой строкой.

Сначала у меня не получилось. После некоторых исследований я нашел решение: мне пришлось использовать «using System»; или 'System.Environment.NewLine'

Smolla 27.02.2012 20:47

Не удалил все символы новой строки. Попробуйте эту строку "\ n \ r \ nМое сообщение \ r \ n \ n \ r \ n следующее. \ n \ n \ r \ n"

Shakti Prakash Singh 04.08.2013 16:12

В целом такое решение мне нравится. Однако обратите внимание, что даже в одной и той же ОС фактические символы новой строки могут не совпадать. Это случилось со мной, почему обработка вернула SQL. Новые строки были \ n, а Environment.NewLine - \ r \ n. В результате ничего не совпало, поэтому остались новые строки.

Dono 02.10.2013 07:06

@Dono> откуда берутся данные SQL? Возможно из внешнего источника, имеющего дело с новыми строками в стиле UNIX. Это проблема с форматом данных, а не с ОС или этим методом ...

Laurent S. 26.11.2013 18:50

Это должен быть один из статических методов класса String. Сам .NET должен уметь определять формат разрывов исходной строки в строке и преобразовывать ее в формат Environment.NewLine \ r \ n ...

Dean Kuga 06.04.2018 23:48

Используйте CSS вместо того, чтобы подвергать себя уязвимостям XSS. <span style = "white-space: pre-line">@Model.CommentText</span>

Mike Olund 13.05.2019 22:05

Если ваш код должен работать в разных средах, я бы подумал об использовании константы Environment.NewLine, поскольку именно newline используется в конкретной среде.

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

Однако, если вы получаете текст из файла, созданного в другой системе, это может быть неправильный ответ, и вам следует заменить любую константу новой строки, используемую в другой системе. Обычно это \n или \r\n.

Вам необходимо переназначить его обратно исходной переменной, поскольку замены не происходит.

tvanfosson 26.10.2008 19:14

@driss Я хотел бы знать, как бы вы выбрали правильную константу новой строки, если вы не знаете, из какой системы пришел файл ... это решение действительно кажется УНИВЕРСАЛЬНЫМ.

Califf 30.03.2013 01:36

Не забывайте, что replace не выполняет замену в строке, а возвращает новую строку с замененными символами. Следующее приведет к удалению разрывов строк (не замене их). Я бы использовал метод @Brian R. Bondy, если бы заменил их чем-то другим, возможно, обернутым как метод расширения. Не забудьте сначала проверить нулевые значения перед вызовом Replace или предоставленных методов расширения.

string line = ...

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

В качестве методов расширения:

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# - пустого символа не существует. '\0' будет работать вместо этого?

Shevek 25.06.2010 17:02

@Shevek - просто использовал неправильные кавычки. Должно быть, в тот день, когда я ответил на это, я уже много работал над javascript.

tvanfosson 25.06.2010 17:25

@Califf - равнозначно, не лучше.

tvanfosson 29.01.2013 18:11

ошибка, которую вы здесь допустили, просто доказывает, что это лучше. У большинства компаний, в которых я работал, есть свой стандарт кодирования - НЕ ИСПОЛЬЗУЙТЕ ЖЕСТКОКОДИРОВАННЫЕ БУКВЫ.

Califf 04.02.2013 03:50

@Califf, "ошибка", которую я совершил, не была бы сделана в среде IDE с Intellisense и не скомпилировалась бы. Если вы чувствуете, что string.Empty лучше, непременно используйте его.

tvanfosson 04.02.2013 08:10
string s = Regex.Replace(source_string, "\n", "\r\n");

или же

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

в зависимости от того, по какому пути вы хотите пойти.

Надеюсь, это поможет.

Лучший способ безопасно заменить перенос строки -

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

это должно создать строку только с \ n (например, перевод строки) в качестве разрывов строки. этот код также полезен для исправления смешанных разрывов строк.

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

Мне нужно было заменить \r\n фактическим возвратом каретки и переводом строки и заменить \t фактической вкладкой. Итак, я придумал следующее:

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

Решения, опубликованные до сих пор, либо заменяют только Environment.NewLine, либо не работают, если строка замены содержит разрывы строк, потому что они вызывают string.Replace несколько раз.

Вот решение, которое использует регулярное выражение для выполнения всех трех замен всего за один проход по строке. Это означает, что строка замены может безопасно содержать разрывы строк.

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

так что вы говорите, что выполнение Regex.Replace (input, @ "[\ r \ n] +", replaceString) не выполнит ту же задачу?

flamebaud 26.06.2013 15:44

@flamebaud Нет, это приведет к другому результату, если в строке будет несколько разрывов строки. «\ r \ n? | \ n» заменяет каждый разрыв строки, а «[\ r \ n] +» выполняет единственную замену для любого количества разрывов строки.

David Hammond 09.09.2014 22:09

Для тех, кто беспокоится о нескольких переносах строки: / (\ r \ n? | \ N) / gm

BobbyA 09.04.2016 01:43

На самом деле это правильное решение, если вы хотите удалить разрыв строки в строке, которая может исходить из другой ОС. Хороший пример - форматирование JSON. +1

Bastien Vandamme 07.10.2016 05:12

Вы не должны использовать дословную строку (префикс @) для своего регулярного выражения, поскольку \r\n экранирован

Mikhail 06.12.2016 17:06

@Mikhail, почему бы не использовать дословная строка (префикс @)?

PreguntonCojoneroCabrón 11.09.2017 12:45

Если дословная строка (префикс @) не используется, вам нужно будет иметь две обратные косые черты подряд везде, где она используется, поэтому ответ @mark_byers выше по-прежнему верен. Префикс @ делает так, что обратная косая черта является частью строки, которая должна быть для Regex, чтобы использовать ее в качестве escape-символа.

Kirk Liemohn 11.09.2017 19:47

Было бы признательно, если бы кто-нибудь отредактировал этот ответ и добавил некоторые из этих комментариев с информацией. Я не могу разобраться в регулярном выражении, но мне нужно больше образцов регулярных выражений для тестирования.

Bizhan 17.12.2017 14:42

Неважно, я пробовал это внутри интерполированной строки. Вы не можете использовать двойные кавычки в одной.

PRMan 07.07.2018 02:21

строка result = System.Text.RegularExpressions.Regex.Replace (plainText, @ "\ r \ n? | \ n", ""); чтобы исправить любые ошибки компилятора.

Dymas 02.08.2019 23:51

Поскольку новая строка может быть разделена \n, \r и \r\n, сначала мы заменим \r и \r\n на \n, и только затем разделим строку данных.

Следующие строки должны перейти к методу parseCSV:

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

Чтобы убедиться, что все возможные способы переноса строк (Windows, Mac и Unix) заменены, вы должны использовать:

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

и в этом порядке, чтобы не делать лишних разрывов строки, когда вы найдете какую-то комбинацию символов окончания строки.

Почему не оба?

string ReplacementString = "";

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

Примечание: Замените strin именем вашей входной строки.

Другой вариант - создать StringReader над рассматриваемой строкой. На ридере делаем .ReadLine() в шлейфе. Затем вы разделяете строки, независимо от того, какие (согласованные или несовместимые) разделители у них были. При этом вы можете действовать по своему усмотрению; одна возможность - использовать StringBuilder и вызвать на нем .AppendLine.

Преимущество состоит в том, что вы позволяете структуре решать, что считать «разрывом строки».

если вы хотите «очистить» новые строки, лучший выбор - комментарий с использованием регулярного выражения @"[\r\n]+".

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

Лучший ответ для замены новых строк в большинстве случаев.

Md Shahbaz Ahmad 25.10.2019 09:26

Спасибо за этот полезный пример кода. Я был исправлен с помощью этого синтаксиса: Regex.Replace (string, @ "[\ r \ n] +", "-")

Sedat Kumcu 20.04.2020 02:01

Это то, что я искал

Pawel Cioch 16.01.2021 02:23

Если вы хотите заменить только символы новой строки:

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

Если вы хотите заменить символы новой строки, табуляции и пробелы:

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

Другие вопросы по теме