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





Используйте метод .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);
}
Это единственное, что у меня сработало, когда я хотел свернуть полученный код веб-страницы в одну строку (для упрощения шаблонов регулярных выражений).
Полностью согласен с Брайаном Р. Бонди. Решение, предложенное Корином и получившее столько голосов, по крайней мере, очень наивно.
Чтобы расширить ответ The.Anyi.9, вы также должны знать о различные типы разрыва строки в общем использовании. В зависимости от того, где был создан ваш файл, вы можете убедиться, что уловили все альтернативы ...
string replaceWith = "";
string removedBreaks = Line.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);
должен заставить тебя идти ...
Сначала мне больше понравилась среда, но если строка не поступает из системы, в которой она работает, она не будет работать. +1
Это решение сработало для меня, когда я попытался использовать его для замены новой строки в выводе PowerShell с C#. Заменить (System.Environment.NewLine, "") у меня сработало.
недостаточно Line.Replace("\n", replaceWith).Replace("\r", replaceWith);?
Нет, потому что, если у вас есть \r\n, вы получите заменяющую строку дважды - не идеально.
Разве вам не нужны строковые литералы? string removeBreaks = Line.Replace (@ "\ r \ n", replaceWith) .Replace (@ "\ n", replaceWith) .Replace (@ "\ r", replaceWith);
@ShawnDotey в этом нет необходимости, мы хотим заменить управляющие символы, а не последовательности обратной косой черты и буквы.
Используйте заменить на Environment.NewLine
myString = myString.Replace(System.Environment.NewLine, "replacement text"); //add a line terminating ;
Как упоминалось в других сообщениях, если строка поступает из другой среды (ОС), вам необходимо заменить эту конкретную реализацию среды символы управления новой строкой.
Сначала у меня не получилось. После некоторых исследований я нашел решение: мне пришлось использовать «using System»; или 'System.Environment.NewLine'
Не удалил все символы новой строки. Попробуйте эту строку "\ n \ r \ nМое сообщение \ r \ n \ n \ r \ n следующее. \ n \ n \ r \ n"
В целом такое решение мне нравится. Однако обратите внимание, что даже в одной и той же ОС фактические символы новой строки могут не совпадать. Это случилось со мной, почему обработка вернула SQL. Новые строки были \ n, а Environment.NewLine - \ r \ n. В результате ничего не совпало, поэтому остались новые строки.
@Dono> откуда берутся данные SQL? Возможно из внешнего источника, имеющего дело с новыми строками в стиле UNIX. Это проблема с форматом данных, а не с ОС или этим методом ...
Это должен быть один из статических методов класса String. Сам .NET должен уметь определять формат разрывов исходной строки в строке и преобразовывать ее в формат Environment.NewLine \ r \ n ...
Используйте CSS вместо того, чтобы подвергать себя уязвимостям XSS. <span style = "white-space: pre-line">@Model.CommentText</span>
Если ваш код должен работать в разных средах, я бы подумал об использовании константы Environment.NewLine, поскольку именно newline используется в конкретной среде.
line = line.Replace(Environment.NewLine, "newLineReplacement");
Однако, если вы получаете текст из файла, созданного в другой системе, это может быть неправильный ответ, и вам следует заменить любую константу новой строки, используемую в другой системе. Обычно это \n или \r\n.
Вам необходимо переназначить его обратно исходной переменной, поскольку замены не происходит.
@driss Я хотел бы знать, как бы вы выбрали правильную константу новой строки, если вы не знаете, из какой системы пришел файл ... это решение действительно кажется УНИВЕРСАЛЬНЫМ.
Не забывайте, что 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 - просто использовал неправильные кавычки. Должно быть, в тот день, когда я ответил на это, я уже много работал над javascript.
@Califf - равнозначно, не лучше.
ошибка, которую вы здесь допустили, просто доказывает, что это лучше. У большинства компаний, в которых я работал, есть свой стандарт кодирования - НЕ ИСПОЛЬЗУЙТЕ ЖЕСТКОКОДИРОВАННЫЕ БУКВЫ.
@Califf, "ошибка", которую я совершил, не была бы сделана в среде IDE с Intellisense и не скомпилировалась бы. Если вы чувствуете, что string.Empty лучше, непременно используйте его.
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 Нет, это приведет к другому результату, если в строке будет несколько разрывов строки. «\ r \ n? | \ n» заменяет каждый разрыв строки, а «[\ r \ n] +» выполняет единственную замену для любого количества разрывов строки.
Для тех, кто беспокоится о нескольких переносах строки: / (\ r \ n? | \ N) / gm
На самом деле это правильное решение, если вы хотите удалить разрыв строки в строке, которая может исходить из другой ОС. Хороший пример - форматирование JSON. +1
Вы не должны использовать дословную строку (префикс @) для своего регулярного выражения, поскольку \r\n экранирован
@Mikhail, почему бы не использовать дословная строка (префикс @)?
Если дословная строка (префикс @) не используется, вам нужно будет иметь две обратные косые черты подряд везде, где она используется, поэтому ответ @mark_byers выше по-прежнему верен. Префикс @ делает так, что обратная косая черта является частью строки, которая должна быть для Regex, чтобы использовать ее в качестве escape-символа.
Было бы признательно, если бы кто-нибудь отредактировал этот ответ и добавил некоторые из этих комментариев с информацией. Я не могу разобраться в регулярном выражении, но мне нужно больше образцов регулярных выражений для тестирования.
Неважно, я пробовал это внутри интерполированной строки. Вы не можете использовать двойные кавычки в одной.
строка result = System.Text.RegularExpressions.Regex.Replace (plainText, @ "\ r \ n? | \ n", ""); чтобы исправить любые ошибки компилятора.
Поскольку новая строка может быть разделена \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
}
}
Лучший ответ для замены новых строк в большинстве случаев.
Спасибо за этот полезный пример кода. Я был исправлен с помощью этого синтаксиса: Regex.Replace (string, @ "[\ r \ n] +", "-")
Это то, что я искал
Если вы хотите заменить только символы новой строки:
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);
Расскажите, пожалуйста, подробнее: что для вас «разрыв строки»? Чем вы хотите их заменить?