#c# #replace
#c# #заменить
Вопрос:
Я получаю строковое сообщение через событие и помещаю его в текстовое поле. К сожалению, в этом сообщении много пустых строк. Как мне заменить две пустые строки одной?
Моя первая мысль о чем-то подобном:
string newLine = Environment.NewLine;
textbox.text = msg.Replace(newLine newLine, newLine);
Я уверен, что есть лучший способ добиться этого.
Комментарии:
1. Я был бы обеспокоен тем, что строка не обязательно имеет Environment.NewLine в качестве новой строки. Из-за этого я бы согласился с ответом @Moo-Juice.
Ответ №1:
Вы могли бы использовать RegEx.Replace
.
Фактически, статья MSDN об этой функции показывает, как избавиться от слишком большого количества пробелов, очень близко к тому, что вы хотите сделать:
http://msdn.microsoft.com/en-us/library/xwewhkd1.aspx
Однако для ваших целей вместо поиска пробелов:
"\s ";
Вы хотите искать новые строки:
"\n ";
Комментарии:
1. Или
@"n "
поэтому экранирование не вызывает беспокойства.2. Приятно, но регулярное выражение действительно медленное
3. @odyodyodys, если наблюдается заметное и неприемлемое замедление работы вашей программы, и было показано, что это единственная процедура, я бы рекомендовал другой метод. Не всегда следует обращать внимание на скорость, пока это не станет реальной проблемой. 🙂
Ответ №2:
Как насчет использования string.Split()
опции RemoveEmptyEntries
:
message = string.Join(Environment.NewLine, message.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries));
Это также будет охватывать более двух новых строк подряд, а не только две.
Ответ №3:
Но ваше String.Replace
решение не будет работать, если в строке три новых строки. Например, рассмотрим:
string s = "hellonnnnnnnnnnnnworld";
string s1 = s.Replace("nn", "n");
string s2 = Regex.Replace(s, "\n{2,}", "n");
s1
в нем будет несколько n
символов. s2
будет иметь только одну.
Это используется n
в качестве примера, но то же самое применимо, если вы используете Environment.NewLine
(т.Е. rn
).
Ответ №4:
textbox.text = Regex.Replace(inputText, @"(" Environment.NewLine ") ", Environment.NewLine);
должно сработать
Комментарии:
1. Вы должны использовать Environment.NewLine поскольку это не новая строка для каждой системы. Это может быть (как в моей ситуации)
rn
Ответ №5:
Вы могли бы использовать регулярное выражение, но тогда у вас возникают две проблемы. Ваш код проще — используйте String.Заменить.
Комментарии:
1. Мне нравится ссылка на Завински там 🙂
2. Я не большой поклонник регулярных выражений, но у них есть свое место. Это один из них. Не существует способа указать
StringReplace
«превратить две или более новых строк в одну новую строку».3. Да, это верно. Я хотел быстро получить ответ и перейти к выполнению некоторой работы, но первоначальное предложение заменяло бы только 2 на 1, а не n на 1.
Ответ №6:
Это предполагает две вещи.
1) Символ новой строки, который вы пытаетесь заменить, является символом новой строки Windows и, скажем, символом новой строки Unix.
2) То, что вы хотите заменить только экземпляры, в которых происходит «новая строка новая строка», а не «новая строка новая строка новая строка», которая тогда, как есть, была бы «новой строкой новая строка». Запомните строку.Replace создает новую строку.
Другими словами, ваша идея ошибочна.
Я предлагаю прочитать это:http://www.dotnetperls.com/remove-whitespace