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

512

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

YonahW
источник
2
Пожалуйста, расскажите нам больше: что для вас означает «разрыв строки»? Чем вы хотите заменить их?
Джей Базузи
ха-ха. Я проверял то же самое в Java, когда я узнал, что System.getProperty ("line.separator") было любопытно узнать аналог в C #. Ваш пост помог мне.
Равиша

Ответы:

715

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

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

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

Корин Блэйки
источник
8
Сначала это не сработало для меня. После некоторых исследований я нашел решение: мне пришлось использовать «с помощью системы»; или «System.Environment.NewLine»
Смолла
12
Не удаляются все символы новой строки. Попробуйте эту строку "\ n \ r \ nМое сообщение \ r \ n \ n \ r \ n это. \ N \ n \ r \ n"
Шакти Пракаш Сингх
13
В общем, мне нравится это решение. Тем не менее, обратите внимание, что даже в одной и той же ОС реальные переводы строк могут не совпадать. Это случилось со мной, почему обработка вернула SQL. Новые строки были \ n, а Environment.NewLine - \ r \ n. В результате ничего не было найдено, поэтому новые строки остались.
Доно
@Dono> откуда берутся данные SQL? Вероятно, из внешнего источника, имеющего дело с новыми строками в стиле UNIX. Это проблема с форматом данных, а не с ОС или этим методом ...
Лоран С.
Это должен быть один из статических методов класса String. Сам .NET должен уметь определять формат разрывов строк в исходной строке и преобразовывать его в формат Environment.NewLine \ r \ n ...
Дин Куга,
442

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

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

string result = Regex.Replace(input, @"\r\n?|\n", replacementString);
Марк Байерс
источник
3
Таким образом, ваше высказывание, выполняющее Regex.Replace (input, @ "[\ r \ n] +", replaceString), не решит ту же задачу?
флейм
7
@flamebaud Нет, это приведет к другому результату, если в строке будет несколько разрывов строк. «\ r \ n? | \ n» будет заменять каждый разрыв строки, в то время как «[\ r \ n] +» будет делать одну замену для любого количества разрывов строки.
Дэвид Хаммонд
Для тех, кто переживает из-за нескольких разрывов строк: / (\ r \ n? | \ N) / gm
BobbyA
4
Это действительно правильное решение, если вы хотите удалить разрыв строки в строке, которая может быть из разных ОС. Хорошим примером является форматирование JSON. +1
Бастьен Вандам
1
Если дословная строка (префикс @) не используется, то вам нужно иметь две обратные косые черты в строке везде, где она используется, поэтому ответ @mark_byers выше по-прежнему правильный. Префикс @ позволяет сделать так, чтобы обратный слеш был частью строки, которая должна быть в Regex, чтобы использовать его в качестве escape-символа.
Кирк Лимон
173

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

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

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

ZombieSheep
источник
6
Сначала мне больше понравилась среда, но если String не приходит из системы, на которой он работает, он не будет работать. +1
Flo
1
не Line.Replace("\n", replaceWith).Replace("\r", replaceWith);достаточно?
Томас Аюб
5
Нет, потому что, если у вас есть, \r\nвы получите строку замены дважды - не идеально.
ZombieSheep
1
Вам не нужны строковые литералы? строка removeBreaks = Line.Replace (@ "\ r \ n", replaceWith) .Replace (@ "\ n", replaceWith) .Replace (@ "\ r", replaceWith);
Шон Дотей
2
@ShawnDotey не нужно, мы хотим заменить управляющие символы, а не последовательности обратной косой черты и буквы.
Н. Кудрявцев
38

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

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

string ReplaceNewlines(string blockOfText, string replaceWith)
{
    return blockOfText.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);
}
Брайан Р. Бонди
источник
Это единственное, что сработало для меня, когда я хотел свернуть извлеченный код веб-страницы в одну строку (для упрощения шаблонов регулярных выражений).
Лапа Бальцерсен
Полностью согласен с Брайаном Р. Бонди. Решение, предложенное Корином и получившее столько голосов, по крайней мере очень наивно.
Califf
18

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

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

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

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

Не забывайте, что замена не выполняет замену в строке, но возвращает новую строку с замененными символами. Следующее удалит разрывы строк (не заменит их). Я бы использовал метод @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 );
   }
}
tvanfosson
источник
не может быть ''в C # - нет такого понятия, как пустой символ. будет '\0'работать вместо?
Шевек
1
@Shevek - просто использовал неправильные кавычки. Должно быть, в тот день, когда я ответил на это, я сделал довольно много javascript.
tvanfosson
@ Калифф - это эквивалентно, а не лучше.
tvanfosson
2
ошибка, которую вы сделали здесь, просто доказывает, что это лучше. Большинство компаний, в которых я работал, имеют свой стандарт кодирования - НЕ ИСПОЛЬЗУЙТЕ ЖЕСТКОДОЧЕННЫЕ ЛИТЕРАЛЫ.
Califf
2
@ Калифф "ошибка", которую я сделал, не была бы сделана в IDE с Intellisense и не была бы скомпилирована. Если вы чувствуете, что string.Emptyлучше, во что бы то ни стало используйте его.
tvanfosson
10

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

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

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

Доминик Шиманский
источник
8

если вы хотите «очистить» новые строки, лучше всего использовать комментарий с пламенной скоростью с использованием регулярных выражений @"[\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
  }
}
ewwink
источник
Лучший ответ для замены новых строк, в большинстве случаев.
Шахбаз Ахмад
Спасибо за этот полезный пример кода. Я был исправлен через этот синтаксис: Regex.Replace (str, @ "[\ r \ n] +", "-")
Седат Кумчу
6

Мне нужно было заменить на \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;
}
Замир
источник
6

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

string ReplacementString = "";

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

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

RAY
источник
4
var answer = Regex.Replace(value, "(\n|\r)+", replacementString);
Мэтт Хинце
источник
2

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

Line.Replace("\n", "whatever you want to replace with");
The.Anti.9
источник
2

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

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

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

данные
источник
2

Как новая строка может быть разделена \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");
}
Amrik
источник
0
string s = Regex.Replace(source_string, "\n", "\r\n");

или

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

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

Надеется, что это помогает.


источник
0

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

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

Джепп Стиг Нильсен
источник
0

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

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);
Tadej
источник