Заменить разрывы строк в строке C # - PullRequest
464 голосов
/ 26 октября 2008

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

Ответы [ 17 ]

666 голосов
/ 26 октября 2008

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

myString = myString.Replace(System.Environment.NewLine, "replacement text")

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

394 голосов
/ 19 ноября 2011

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

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

string result = Regex.Replace(input, @"\r\n?|\n", replacementString);
169 голосов
/ 26 октября 2008

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

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

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

35 голосов
/ 26 октября 2008

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

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

string ReplaceNewlines(string blockOfText, string replaceWith)
{
    return blockOfText.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);
}
18 голосов
/ 26 октября 2008

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

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

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

14 голосов
/ 26 октября 2008

Не забывайте, что 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 );
   }
}
8 голосов
/ 19 февраля 2016

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

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

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

6 голосов
/ 25 августа 2011

Мне нужно было заменить \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;
}
5 голосов
/ 31 марта 2016

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

string ReplacementString = "";

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

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

4 голосов
/ 14 октября 2018

, если вы хотите "очистить" новые строки, лучше всего использовать комментарий пламенного бода с использованием регулярного выражения @"[\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
  }
}
...