Заменяем Разрывы Строк в C#
Замена разрывов строк в тексте - довольно распространённая задача. Иногда нужно сделать текст в одну строку, либо заменить разрыв строки HTML-элементом
<br /> для отображения на веб-сайте. Посмотрим, как это можно сделать.В C# используются два основных типа разрывов строк:
-
\n: символ новой строки, используемый в системах Unix и Linux.-
\r\n: символ возврата каретки в сочетании с символом новой строки, используется в системах Windows.Рекомендуемый способ записи разрыва строки — использовать Environment.Newline, который преобразуется в
\n или \r\n в зависимости от системы.1. Замена старым способом
Используем метод Replace() класса String:
const string text =Результат:
"This is a line.\rThis is another line.";
var newText = text
.Replace("\r\n", "\n")
.Replace("\r", "\n");
This is a line.\nThis is another line.2. Новый способ
Метод ReplaceLineEndings(), представленный в .NET 6, является более специализированным инструментом для замены разрывов строк и это рекомендуемый подход. Требуется один аргумент: любая строка для строки замены (по умолчанию - Environment.NewLine)
var newText = text.ReplaceLineEndings("\n");
Результат будет таким же, как и в предыдущем способе.3. Регулярные выражения
Аналогично методу Replace() класса String, можно использовать метод Regex.Replace():
var newText = RegexИ снова, результат будет тем же.
.Replace(text, @"(\r\n|\r)", "\n");
Производительность
Я протестировал производительность всех трёх способов в трёх версиях: .NET6, .NET7 и .NET8.
- string.Replace() примерно постоянен (~30-40нс).
- ReplaceLineEndings() примерно в 3 раза медленнее в .NET6 и .NET7 (~100-130нс), но в .NET8 он стал наоборот быстрее - ~25нс.
- Regex.Replace() примерно в 7 раз медленнее string.Replace() (~240-270нс) в .NET6 и .NET7, в .NET8 стал немного быстрее - ~200нс.
Однако, в .NET7+ для регулярных выражений мы можем использовать кодогенерацию (это даже предлагает сделать IDE):
var newText = MyRegex().Replace(text, "\n");Тогда метод Regex станет быстрее: ~180нс в .NET7 и ~130нс в .NET8.
[GeneratedRegex(@"(\r\n|\r)")]
private static partial Regex MyRegex();
Памяти все методы используют одинаково – 96 байт.
Источник: https://code-maze.com/csharp-replace-line-breaks-in-a-string/