Wie entferne ich neue Zeilenzeichen aus einer Zeichenfolge?

180

Ich habe eine Zeichenfolge im folgenden Format

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

Ich möchte alle Vorkommen von \nund \raus der obigen Zeichenfolge entfernen .

Ich habe es versucht, string s = s.Trim(new char[] {'\n', '\r'});aber es hat nicht geholfen.

Ashish Ashu
quelle

Antworten:

321

Ich verwende gerne reguläre Ausdrücke. In diesem Fall könnten Sie Folgendes tun:

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

Reguläre Ausdrücke sind in der .NET-Welt nicht so beliebt wie in den dynamischen Sprachen, bieten jedoch viel Möglichkeiten zum Manipulieren von Zeichenfolgen.

Kirche
quelle
Dies war definitiv die beste Lösung für mich. Eine reibungslose Mischung aus C # und Javascript war alles, was ich brauchte, um mein Problem zu lösen.
Joe Brunscheon
Ich hatte ein ähnliches Problem, bei dem ich auch Zeilenumbrüche aus meiner Zeichenfolge entfernen musste. Ich habe versucht, es mit string zu tun. Ersetzen, hat nicht funktioniert. Als ich Regex.Replace mit genau der gleichen Zeichenfolge für reguläre Ausdrücke wie der Parameter verwendet habe, hat es funktioniert. Vielen Dank.
Instanz vom
8
Seien Sie vorsichtig, wenn Sie dies in einer Schleife verwenden, die mehr als 1 Million Elemente verarbeitet. Regex ist viel langsamer als nur String.Replace
Nick
Das Codebeispiel entfernt auch Tabs \ t, was nicht in Frage kommt.
Michael Freidgeim
70

Sie möchten verwenden String.Replace, um ein Zeichen zu entfernen.

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

Beachten Sie, dass String.Trim(params char[] trimChars)nur führende und nachfolgende Zeichen trimCharsaus der aufgerufenen Instanz entfernt werden.

Sie können eine Erweiterungsmethode erstellen, mit der die oben genannten Leistungsprobleme beim Erstellen vieler temporärer Zeichenfolgen vermieden werden:

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();
}
Jason
quelle
8
Beachten Sie, dass bei diesem Ansatz zwei Zwischenzeichenfolgenobjekte erstellt werden. Abhängig von der Größe Ihrer Zeichenfolge kann dies erhebliche Auswirkungen auf die Leistung und den Speicherverbrauch haben.
CDhowie
40

Ich weiß, dass dies ein alter Beitrag ist, aber ich dachte, ich würde die Methode teilen, mit der ich neue Zeilenzeichen entferne.

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

Verweise:

MSDN String.Replace-Methode und MSDN Environment.NewLine-Eigenschaft

ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
quelle
schön für Mono Support
Nick
1
In einer umweltübergreifenden Anwendung (dh einer Windows-App, die mit Daten vom Unix-System gespeist wird) verursacht dies mehr Probleme als Gewinne.
Jakub Szułakiewicz
15

Wenn Geschwindigkeit und geringe Speichernutzung wichtig sind, gehen Sie wie folgt vor:

var sb = new StringBuilder(s.Length);

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

s = sb.ToString();
cdhowie
quelle
Ja, ich würde auch damit anfangen (in einer Erweiterungsmethode). Es ist immer gut, StringBuilder zu verwenden. +1
RPM1984
4
"Immer gut, um den StringBuilder zu benutzen" <Ich bin kein Profi, aber das stimmt nicht ganz. Dieser Artikel von Jeff Atwood bietet einen unterhaltsamen Einblick in die Manipulation / Verkettung von Strings und letztendlich in die Optimierung.
Phil Cooper
5

mach das einfach

s = s.Replace("\n", String.Empty).Replace("\t", String.Empty).Replace("\r", String.Empty);
Mahmoud ElMansy
quelle
3

Ein LINQ-Ansatz:

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'));
wb
quelle
1
Dies verwendet die generische Überladung string.Join, die ToStringbei jedem charvon der Abfrage zurückgegebenen Aufruf auftritt. Es ist besser, die Abfrageergebnisse einfach an den stringKonstruktor zu übergeben. s1 = new string(s.Where(....).ToArrary());
Juharr
0

Die richtige Wahl hängt wirklich davon ab, wie groß die Eingabezeichenfolge ist und wie hoch die Perforations- und Speicheranforderungen sind, aber ich würde einen regulären Ausdruck wie verwenden

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

Oder wenn wir denselben Ersatz mehrmals anwenden müssen, ist es besser, eine kompilierte Version für Regex wie zu verwenden

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

HINWEIS: Unterschiedliche Szenarien erfordern unterschiedliche Ansätze, um die beste Leistung und den minimalen Speicherverbrauch zu erzielen

Kalitsov
quelle
0

Nun ... Ich möchte, dass Sie spezifischere Bereiche des Raums verstehen. \twird tatsächlich als horizontaler Raum sortiert, nicht als vertikaler Raum. (Testen Sie das Einfügen \tin den Editor)

Wenn Sie Java verwenden, verwenden Sie einfach \v. Siehe die Referenz unten.

\h - Ein horizontales Leerzeichen:

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

\v - Ein vertikales Leerzeichen:

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

Mir ist jedoch bewusst, dass Sie .NET verwenden. Meine Antwort auf das Ersetzen jedes vertikalen Raums lautet also ..

string replacement = Regex.Replace(s, @"[\n\u000B\u000C\r\u0085\u2028\u2029]", "");
Kang Andrew
quelle
Es sieht aus wie eine Antwort auf eine andere Frage ... und auch fehlende tatsächliche Referenz ...
Alexei Levenkov
-4

Sie können verwenden, Trimwenn Sie von Anfang und Ende entfernen möchten.

string stringWithoutNewLine = "\n\nHello\n\n".Trim();
Ankit Arya
quelle
-6

Zu Ihrer Information,

Trim () macht das schon.

Das folgende LINQPad-Beispiel:

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

Ausgänge:

23
18
lnaie
quelle
5
Das entfernt nicht das \ n in der Mitte.
FlappySocks