Teilen Sie eine Zeichenfolge durch eine andere Zeichenfolge in C #

681

Ich habe die Split()Methode zum Teilen von Zeichenfolgen verwendet, aber dies scheint nur zu funktionieren, wenn Sie eine Zeichenfolge durch ein Zeichen teilen. Gibt es eine Möglichkeit, a zu teilen string, wobei eine andere Zeichenfolge die Aufteilung nach Parameter ist?

Ich habe versucht, den Splitter ohne Glück in ein Zeichenarray umzuwandeln.

Mit anderen Worten, ich möchte Folgendes aufteilen string:

THExxQUICKxxBROWNxxFOX

von xxund geben ein Array mit Werten zurück:

DER SCHNELLE BRAUNE FUCHS

Brandon
quelle
2
Für zukünftige Bedenken: Einer der folgenden Kommentare hat mich interessiert, daher habe ich beschlossen, eine Diskussion über Software-Engineering über die nicht intuitive (aber richtige) Vorgehensweise in der akzeptierten Antwort zu eröffnen .
scharette

Antworten:

1238

Um durch einen String zu teilen, müssen Sie die Überladung des String-Arrays verwenden .

string data = "THExxQUICKxxBROWNxxFOX";

return data.Split(new string[] { "xx" }, StringSplitOptions.None);
Adam Robinson
quelle
4
Ich habe meine Antwort aus zwei Gründen geändert: # 1: Um die Teilungen zu verarbeiten, die ich durchführen möchte, müsste ich Regex.Escape verwenden, da meine geteilte Zeichenfolge häufig Sternchen usw. enthält. # 2: Während dieses Programms Ich schreibe, braucht keine wirkliche Optimierung, es scheint zusätzlichen Aufwand mit der Verwendung der Regex Split-Methode zu geben.
Brandon
7
@Peter: In diesem Beitrag schlägt Jon es vor, weil das Poster kein festes Trennzeichen hat. er versucht, Zeichenfolgen zu teilen, die durch "mehr als ein Leerzeichen" (was 2+ bedeutet) getrennt sind. Für Zeichenfolgen , die eher durch ein Muster als durch einen Wert begrenzt sind , ist RegEx eine großartige (nun ja, einzige ) Option. Bei Festwertbegrenzern führt dies zu unnötigem Overhead. Versuchen Sie, einen Test durchzuführen. Wenn die Anzahl der Operationen zunimmt, dauert RegEx ungefähr 10-mal so lange wie eine entsprechende string.Split.
Adam Robinson
9
Ich komme von Python nach C #. Python unterstützt Zeichenfolgen, die durch eine andere Zeichenfolge geteilt werden. Und ich muss häufig auf diese Frage zurückkommen, um eine einfache Antwort auf diese Frage zu erhalten. Dies string[] Split(string pattern)ist die natürlichste Verwendung, die ich mir vorstellen kann, aber sie ist nicht vorhanden. Ich habe C schon einmal geschrieben, daher bin ich es gewohnt, Arrays zu chargen, aber ich hasse es immer noch, wenn es char[]in einem C # -Code auftaucht, weil es meine Aufmerksamkeit plötzlich von Stream-Ebene zu Byte-Ebene zieht. Weiß jemand, warum Leute aus der C # -Bibliothek die Split-Methode so entworfen haben? Wenn es einen guten Grund gibt, kann ich wahrscheinlich versuchen, ihn trotz der Unannehmlichkeiten zu schätzen.
Foresightyj
11
Dieses Snippet steht ganz oben auf der Liste der Dinge, für die ich mich schämen würde, wenn ich es Nicht-C # -Entwicklern zeigen würde.
Traubenfuchs
98
Warum zum Teufel können wir das nicht einfach tun data.Split("xx")?
Mcont
122

Es gibt eine Überladung von Split , die Zeichenfolgen benötigt.

"THExxQUICKxxBROWNxxFOX".Split(new [] { "xx" }, StringSplitOptions.None);

Sie können eine dieser StringSplitOptions verwenden

  • Keine - Der Rückgabewert enthält Array-Elemente, die eine leere Zeichenfolge enthalten
  • RemoveEmptyEntries - Der Rückgabewert enthält keine Array-Elemente, die eine leere Zeichenfolge enthalten

Wenn die Zeichenfolge also "THExxQUICKxxxxBROWNxxFOX" lautet, StringSplitOptions.Nonewird ein leerer Eintrag im Array für den Teil "xxxx" zurückgegeben, während dies StringSplitOptions.RemoveEmptyEntriesnicht der Fall ist .

Greg
quelle
73
Regex.Split(string, "xx")

ist die Art, wie ich es normalerweise mache.


Natürlich brauchen Sie:

using System.Text.RegularExpressions;

oder :

System.Text.RegularExpressions.Regex.Split(string, "xx")

aber andererseits brauche ich diese Bibliothek die ganze Zeit.

Peter
quelle
13
@Brandon: Während ich normalerweise vor vorzeitiger Optimierung warne, sollten Sie sich bewusst sein, dass a aufgrund des Overheads für reguläre Ausdrücke RegEx.Spliteiniges teurer ist als ein einfaches String.Split.
Adam Robinson
9
Wenn Sie durch eine beliebige Zeichenfolge teilen möchten, verwenden Sie zuerst Regex.Escapedie Zeichenfolge. Dadurch werden alle regulären Regex-Metazeichen ausgeblendet.
Richard
Einer der Hauptvorteile, die sich für den Overhead auszahlen können, ist die Möglichkeit, eine Einstellung für den String-Vergleich bereitzustellen
Timur Sadykov,
47

Es gibt eine Überladung von String.Split dafür:

"THExxQUICKxxBROWNxxFOX".Split(new [] {"xx"}, StringSplitOptions.None);
bruno conde
quelle
1
Die einzige Antwort, die die unnötige Array-Typdeklaration entfernt.
Wonea
25

Im Allgemeinen verwende ich dafür gerne meine eigene Erweiterung:

string data = "THExxQUICKxxBROWNxxFOX";
var dataspt = data.Split("xx");
//>THE  QUICK  BROWN  FOX 


//the extension class must be declared as static
public static class StringExtension
{   
    public static string[] Split(this string str, string splitter)
    {
        return str.Split(new[] { splitter }, StringSplitOptions.None);
    }
}

Dies führt jedoch zu einer Ausnahme, wenn Microsoft beschließt, diese Methodenüberladung in späteren Versionen aufzunehmen. Dies ist auch der wahrscheinliche Grund, warum Microsoft diese Methode in der Zwischenzeit nicht aufgenommen hat: Mindestens ein Unternehmen, für das ich gearbeitet habe, hat eine solche Erweiterung in allen C # -Projekten verwendet.

Es kann auch möglich sein, die Methode zur Laufzeit bedingt zu definieren, wenn sie nicht vorhanden ist.

Lorenz Lo Sauer
quelle
4
Alternativ Verwendung params string[] splitterals zweiter Parameter und Änderung new[] {splitter}auf , splitterum mehrere Begrenzungszeichen zu unterstützen.
Matthew Strawbridge
10

Die vorherigen Antworten sind alle richtig. Ich gehe noch einen Schritt weiter und lasse C # für mich funktionieren, indem ich eine Erweiterungsmethode für String definiere:

public static class Extensions
{
    public static string[] Split(this string toSplit, string splitOn) {
        return toSplit.Split(new string[] { splitOn }, StringSplitOptions.None);
    }
}

Auf diese Weise kann ich es auf jede einfache Weise aufrufen, wie ich es beim ersten Versuch naiv erwartet hatte:

"a big long string with stuff to split on".Split("g str");
Argyle
quelle
7
string data = "THExxQUICKxxBROWNxxFOX";

return data.Replace("xx","|").Split('|');

Wählen Sie einfach das Ersetzungszeichen sorgfältig aus (wählen Sie eines aus, das wahrscheinlich noch nicht in der Zeichenfolge vorhanden ist)!

Haken
quelle
2
@ MasoudHosseini: Bitte lesen Sie die vollständige Antwort; Es gibt bereits einen Haftungsausschluss.
SNag
3
@kobe: Weil es ein schrecklicher Hack ist.
Overv
3
Funktioniert gut, aber es ist gefährlich für generische Methoden
Kaizonaro
5
Erklärungen wie "Es ist ein schrecklicher Hack" oder "eine schlechte Antwort" sind nicht hilfreich. Es ist einfach eine Meinung ohne Erklärung. Geben Sie stattdessen Folgendes an: "Es ist nicht erforderlich, sowohl die Zeichenfolge nach Ersetzungen zu durchsuchen als auch nach geteilten Zeichen zu suchen, da dies zu einer schlechten Leistung führt." wäre ein besserer Weg, sich selbst zu erklären. Zu viele Programmierer verhalten sich so. :(
Matt Ruwe
1
Was ist, wenn die Zeichenfolge das |Zeichen bereits enthält? Aus diesem Grund halte ich die Verwendung für gefährlich.
und
-1

Das ist auch einfach:

string data = "THExxQUICKxxBROWNxxFOX";
string[] arr = data.Split("xx".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
user890255
quelle
1
Aber dies würde sich auch teilen, "THExQUICK"wo wir nicht wollen, dass es geteilt wird
Rafalon
Danke Rafalon: Ja, Greg's ist die beste Antwort: data.Split (neuer String [] {"xx"}, StringSplitOptions.RemoveEmptyEntries)
user890255
-4

Der einfachste Weg ist zu verwenden String.Replace:

string myString = "THExxQUICKxxBROWNxxFOX";
mystring = mystring.Replace("xx", ", ");

Oder einfacher:

string myString = "THExxQUICKxxBROWNxxFOX".Replace("xx", ", ");
user3458227
quelle
3
So wie es ist, wird dies kein Array zurückgeben (wie in der Frage gefordert), sondern nur eine Zeichenfolge mit Kommas, wo die xxwaren.
Arj
Und nicht nur, dass Sie die Wörter nicht richtig aufteilen könnten, wenn die Zeichenfolge zusätzliche Kommas enthalten würde.
user3658298