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

410

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

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

14 ответов

546
Лучший ответ

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

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

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

  • 7
    Сначала это не сработало для меня. После некоторых исследований я нашел решение: мне пришлось использовать «с помощью системы»; или 'System.Environment.NewLine'
  • 10
    Не удаляются все символы новой строки. Попробуйте эту строку "\ n \ r \ nМое сообщение \ r \ n \ n \ r \ n это. \ N \ n \ r \ n"
Показать ещё 3 комментария
307

Решения, опубликованные до сих пор, либо заменяют только 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] +» будет делать одну замену для любого количества разрывов строки.
Показать ещё 8 комментариев
159

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

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

должен вас поймать...

  • 20
    +1 это решение более полное.
  • 6
    Сначала мне больше понравилась среда, но если String не приходит из системы, на которой он работает, он не будет работать. +1
Показать ещё 5 комментариев
28

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

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

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

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

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

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

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

Не забывайте, что замена не выполняет замену в строке, но возвращает новую строку с замененными символами. Ниже будут удалены разрывы строк (не заменяются). Я бы использовал метод @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 );
   }
}
  • 0
    не может иметь '' в C # - нет такого понятия, как пустой символ. вместо этого будет работать '\0' ?
  • 1
    @Shevek - просто использовал неправильные кавычки. Должно быть, в тот день, когда я ответил на это, я сделал довольно много javascript.
Показать ещё 4 комментария
7

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

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

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

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

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

string ReplacementString = "";

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

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

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

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

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

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

2

Использовать метод .Replace()

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

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

или

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню