Как удалить символы новой строки из строки?


181

У меня есть строка в следующем формате

string s = "This is a Test String.\n   This is a next line.\t This is a tab.\n'

Я хочу удалить все вхождения \nи \rиз строки выше.

Я пытался, string s = s.Trim(new char[] {'\n', '\r'});но это не помогло.

Ответы:


321

Мне нравится использовать регулярные выражения. В этом случае вы можете сделать:

string replacement = Regex.Replace(s, @"\t|\n|\r", "");

Регулярные выражения не так популярны в мире .NET, как в динамических языках, но они предоставляют много возможностей для манипулирования строками.


Это было определенно лучшее решение для меня. Плавное сочетание этого C # и javascript было всем, что мне нужно для решения моей проблемы.
Джо Брюншеон

У меня была похожая проблема, когда мне нужно было также удалить перевод строки из моей строки. Я пытался сделать это с помощью строки. Заменить, не сработало. Когда я использовал Regex.Replace с той же строкой регулярного выражения, что и параметр, это работало. Спасибо.
экземпляр

8
Будьте осторожны при использовании этого в цикле, который обрабатывает 1M + элементов. Regex намного медленнее, чем просто String.Replace
Ник

Пример кода также удаляет вкладки \ t, о которых не идет речь.
Майкл

71

Вы хотите использовать String.Replaceдля удаления персонажа.

s = s.Replace("\n", String.Empty);
s = s.Replace("\r", String.Empty);
s = s.Replace("\t", String.Empty);

Обратите внимание, что String.Trim(params char[] trimChars)удаляются только начальные и конечные символы trimCharsиз вызванного экземпляра.

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

static string RemoveChars(this string s, params char[] removeChars) {
    Contract.Requires<ArgumentNullException>(s != null);
    Contract.Requires<ArgumentNullException>(removeChars != null);
    var sb = new StringBuilder(s.Length);
    foreach(char c in s) { 
        if(!removeChars.Contains(c)) {
            sb.Append(c);
        }
    }
    return sb.ToString();
}

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

40

Я знаю, что это старый пост, однако я решил поделиться методом, который я использую для удаления символов новой строки.

s.Replace(Environment.NewLine, "");

Ссылки:

Метод MSDN String.Replace и свойство MSDN Environment.NewLine


хорошо для поддержки Mono
Ник

1
В кросс-среде (то есть в приложении Windows, которое снабжается данными из системы Unix) это вызовет больше проблем, чем прибыль.
Якуб Шулакевич

15

Если важны скорость и низкое использование памяти, сделайте что-то вроде этого:

var sb = new StringBuilder(s.Length);

foreach (char i in s)
    if (i != '\n' && i != '\r' && i != '\t')
        sb.Append(i);

s = sb.ToString();

Да, я бы пошел с этим тоже (в методе расширения). Всегда хорошо использовать StringBuilder. +1
RPM1984

4
«Всегда хорошо использовать StringBuilder» <Я не профессионал, но это не совсем так. Эта статья Джеффа Этвуда (Jeff Atwood) дает забавное представление о манипулировании / конкатенации строк и, в конечном итоге, оптимизации.
Фил Купер


3

Подход LINQ:

string s = "This is a Test String.\n   This is a next line.\t This is a tab.\n'";

string s1 = String.Join("", s.Where(c => c != '\n' && c != '\r' && c != '\t'));

1
Это использует общую перегрузку, string.Joinкоторая будет вызывать ToStringкаждый charвозвращенный запросом. Лучше просто передать результаты запроса stringконструктору. s1 = new string(s.Where(....).ToArrary());
juharr

0

Правильный выбор действительно зависит от того, насколько велика входная строка и каковы требования к производительности и памяти, но я бы использовал регулярное выражение вроде

string result = Regex.Replace(s, @"\r\n?|\n|\t", String.Empty);

Или, если нам нужно применить одну и ту же замену несколько раз, лучше использовать скомпилированную версию для Regex, например

var regex = new Regex(@"\r\n?|\n|\t", RegexOptions.Compiled); 
string result = regex.Replace(s, String.Empty);

ПРИМЕЧАНИЕ: разные сценарии требуют разных подходов для достижения наилучшей производительности и минимального потребления памяти.


0

Ну ... я хотел бы, чтобы вы поняли более конкретные области космоса. \tна самом деле сортируется как горизонтальное пространство, а не вертикальное пространство. (проверить вставку \tв блокнот)

Если вы используете Java, просто используйте \v. Смотрите ссылку ниже.

\h - Горизонтальный символ пробела:

[\t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]

\v - вертикальный пробел:

[\n\x0B\f\r\x85\u2028\u2029]

Но я знаю, что вы используете .NET. Так что мой ответ на замену каждого вертикального пространства ...

string replacement = Regex.Replace(s, @"[\n\u000B\u000C\r\u0085\u2028\u2029]", "");

Похоже, ответ на какой-то другой вопрос ... и также отсутствует фактическая ссылка ...
Алексей Левенков

-4

Вы можете использовать, Trimесли вы хотите удалить от начала и до конца.

string stringWithoutNewLine = "\n\nHello\n\n".Trim();

-6

FYI,

Trim () уже делает это.

Следующий пример LINQPad:

void Main()
{
    var s = " \rsdsdsdsd\nsadasdasd\r\n ";
    s.Length.Dump();
    s.Trim().Length.Dump();
}

Выходы:

23
18

5
Это не удаляет \ n в середине.
FlappySocks 26.09.15
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.