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

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

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'});, но это не помогло.

Ответ 1

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

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

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

Ответ 2

Вы хотите использовать 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();
}

Ответ 4

Если важны скорость и низкое использование памяти, сделайте следующее:

var sb = new StringBuilder(s.Length);

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

s = sb.ToString();

Ответ 5

просто сделайте это

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

Ответ 6

Подход 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'));

Ответ 7

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

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);

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

Ответ 8

Хорошо... Я хотел бы, чтобы вы поняли более конкретные области пространства. \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]", "");

Ответ 9

FYI,

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

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

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

Выходы:

23
18

Ответ 10

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

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