Як видалити нові рядки з рядка?


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 було все, що мені було потрібно для вирішення моєї проблеми.
Джо Браншон

У мене була подібна проблема, коли мені потрібно було також видалити нові рядки зі свого рядка. Я намагався зробити це за допомогою string.Replace, не вийшло. Коли я використовував Regex.Replace з точно таким же строком регулярного вираження, що і параметр, він працював. Дякую.
екземпляр

8
Будьте обережні, якщо використовуєте це в циклі, який обробляє елементи 1М +. 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) це спричинить більше проблем, ніж прибутку.
Якуб Szułakiewicz

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" <Я не професіонал, але це не зовсім так. Ця стаття Джеффа Етвуда забезпечує цікаве розуміння маніпуляцій / конкатенації рядків і, зрештою, оптимізації.
Філ Купер


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.