2010-02-11 13 views
452

Ich habe die Split() Methode verwendet, um Zeichenfolgen zu trennen, aber das scheint nur zu funktionieren, wenn Sie eine Zeichenfolge durch ein Zeichen aufteilen. Gibt es eine Möglichkeit, eine string zu teilen, wobei eine andere Zeichenfolge der Split-by-Parameter ist? Ich habe versucht, den Splitter in ein Zeichenarray umzuwandeln, ohne Glück.C# Aufteilen einer Zeichenfolge durch eine andere Zeichenfolge

Mit anderen Worten, würde Ich mag die string aufzuspalten:

THExxQUICKxxBROWNxxFOX

von xx, und ein Array mit Werten:

THE QUICK, BROWN, FOX

Antwort

821

Um mit einer Zeichenfolge zu teilen, müssen Sie die string array overload verwenden.

string data = "THExxQUICKxxBROWNxxFOX"; 

return data.Split(new string[] { "xx" }, StringSplitOptions.None); 
+4

ich landete tatsächlich zwei Gründe für meine Antwort auf diese Veränderung auf: # 1: den Spagat behandeln ich, ich müsste Regex.Escape verwenden, da meine Split String oft Sternchen tun wollen enthalten usw. # 2: Während dieses Programm brauche ich keine wirkliche Optimierung, da d Es scheint, dass zusätzlicher Aufwand für die Verwendung der Regex-Split-Methode entsteht. – Brandon

+1

Zu meiner Verteidigung schlug Jon Skeet irgendwo vor, Regex zu benutzen, wenn er Saiten mit Saiten als Seperator spaltet, und ich muss zugeben, wenn er etw. Vorschlägt. Ich neige dazu zu glauben, dass es selten ein schlechter Rat ist. ('Obwohl die Chancen sind Sie wollen splitten durch Zeichenfolge statt Zeichen, in diesem Fall werden Sie sehen wollenRegEx.Split') – Peter

+7

@Peter: In diesem Beitrag Jon schlägt es vor, weil das Plakat hat keine feste Begrenzer; er sucht nach Strängen, die durch "mehr als einen Raum" getrennt sind (also 2+). Für Strings, die durch ein * pattern * und nicht durch einen * value * begrenzt sind, ist RegEx eine großartige (na ja, die * einzige *) Option. Bei Begrenzern mit festen Werten führt dies zu unnötigem Overhead. Probiere einen Test aus; Wenn die Anzahl der Operationen steigt, nimmt RegEx ungefähr ~ 10x so lange wie eine entsprechende 'string.split'. –

52
Regex.Split(string,"xx") 

ist so, wie ich es normalerweise tun. Natürlich benötigen Sie einen

using System.Text.RegularExpressions; 

aber als ich wieder brauchen, dass die ganze Zeit lib.

+7

@Brandon: Während ich normalerweise vor vorzeitiger Optimierung warne, sollten Sie sich bewusst sein, dass ein 'RegEx.Split' aufgrund des regulären Ausdruck-Overheads ziemlich viel teurer ist als ein einfacher' String.Split'. –

+7

Wenn Sie nach einer willkürlichen Zeichenkette teilen wollen, verwenden Sie zuerst 'Regex.Escape' in der Zeichenkette. Dadurch werden alle Regex-Metazeichen entfernt. – Richard

+0

einer der wichtigsten Vorteile, die für Overhead bezahlen können, ist die Möglichkeit, Stringvergleichseinstellung bereitzustellen –

85

Es gibt eine overload of Split, die Strings nimmt.

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

Sie können entweder dieser StringSplitOptions verwenden

  • Keine - Der Rückgabewert enthält Array Elemente, die einen leeren String enthalten
  • RemoveEmptyEntries - Der Rückgabewert nicht enthalten Array-Elemente, die enthalten eine leere Zeichenfolge

Also, wenn die Zeichenfolge „THExxQUICKxxxxBROWNxxFOX“ ist, StringSplitOptions.None einen leeren Eintrag in dem Array für den „xxxx“ Teil zurückzukehren, während StringSplitOptions.RemoveEmptyEntries nicht.

+1

Sie müssen Zeichenfolge nicht nach Neu angeben: '" THEXQUICKxxBROWNxxFOX ".Split (new [] {" xx "}, StringSplitOptions. Keine); ' wird funktionieren. – JayJay

+0

Fest, danke. Alter Code war alt. – Greg

35

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

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

Die einzige Antwort, die die unnötige Array-Typ-Deklaration entfernt. – wonea

16

ich, dass meine eigene Erweiterung nutzen möchten im Allgemeinen:

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 wird jedoch zu einer Ausnahme führen, wenn Microsoft enthalten entscheidet diese Methodenüberladung in späteren Versionen. Es ist auch der wahrscheinliche Grund, warum Microsoft diese Methode in der Zwischenzeit nicht berücksichtigt hat: Mindestens eine Firma, für die ich gearbeitet habe, hat eine solche Erweiterung in allen ihren C# -Projekten verwendet.

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

+1

Alternativ können Sie 'params string [] splitter' als zweiten Parameter verwenden und' new [] {splitter} 'in' splitter' ändern, um mehrere Trennzeichen zu unterstützen. –

0

Der einfachste Weg ist die Verwendung String.Replace:

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

Oder einfacher:

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

Wie es ist, wird dies nicht ein Array zurückgeben (wie die Frage verlangt), nur eine Zeichenfolge mit Kommas, wo die 'xx's waren. – Arj

+0

Und nicht nur das, wenn die Zeichenkette zusätzliche Kommas enthält, könnten Sie die Wörter nicht richtig austeilen. – user3658298

4
string data = "THExxQUICKxxBROWNxxFOX"; 

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

einfach das ersetzen Charakter sorgfältig auswählen (wählen Sie eine, die nicht wahrscheinlich ist, anwesend zu sein in der Schnur schon)!

+0

Warum diese Antwort abgelehnt wurde? – kobe

+2

@MasoudHosseini: Bitte lesen Sie die vollständige Antwort; Es gibt bereits einen Haftungsausschluss. – SNag

+1

@ Kobe: Weil es ein schrecklicher Hack ist. – Overv

3

Die obigen Antworten sind alle korrekt. Ich gehe noch einen Schritt weiter und C# Arbeit für mich machen, indem eine Erweiterungsmethode auf String definieren:

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

So kann ich es auf jeder Zeichenfolge in der einfachen Art und Weise nennen kann ich naiverweise das erste Mal erwartete ich versuchte, dies zu tun :

"a big long string with stuff to split on".Split("g str"); 
Verwandte Themen