2010-01-07 9 views
69

String.Split ist praktisch zum Teilen einer Zeichenfolge mit mehreren Teilen auf einem Trennzeichen.String.Split nur am ersten Trennzeichen in C#?

Wie soll ich eine Zeichenfolge nur auf dem ersten Trennzeichen aufteilen. Z.B. Ich habe einen String

"Time: 10:12:12\r\n" 

Und ich würde einen Array will wie in Ihrem Beispiel

{"Time","10:12:12\r\n"} 
+0

geteilt mit Leerzeichen? und setze ein arry = yourString.Split (''); –

+1

@RamgyBorja das wird nicht funktionieren, wenn er auch die ':' aus 'Zeit' und sowieso nicht, was gefragt wurde – smurtagh

+0

@smurtagh ja, für die sichere Codierung verwendet Trimmen –

Antwort

128

Der beste Ansatz hängt ein wenig davon ab, wie flexibel das Parsen sein soll, im Hinblick auf mögliche zusätzliche Leerzeichen und ähnliches. Überprüfen Sie die genauen Formatspezifikationen, um zu sehen, was Sie brauchen.

yourString.Split(new char[] { ':' }, 2) 

Begrenzt Sie zwei 2 Teilstrings. Dies trimmt jedoch nicht den Platz am Anfang der zweiten Zeichenfolge. Sie könnten dies jedoch in einer zweiten Operation nach dem Split tun.

Sollte funktionieren, aber wird brechen, wenn Sie versuchen, einen Header-Namen zu trennen, der ein Leerzeichen enthält.

yourString.Split(new string[] { ": " }, 2, 
    StringSplitOptions.None); 

Wird genau das tun, was Sie beschreiben, aber tatsächlich erfordert der Platz vorhanden sein.

yourString.Split(new string[] { ": ", ":" }, 2, 
    StringSplitOptions.None); 

Macht den Raum optional, aber Sie würden immer noch zu TrimStart() im Falle von mehr als einem Raum haben.

Um das Format zu halten etwas flexibel, und Ihr Code lesbar ist, schlage ich vor, die erste Option:

string[] split = yourString.Split(new char[] { ':' }, 2); 
// Optionally check split.Length here 
split[1] = split[1].TrimStart(); 
+0

Warum nicht die (String [], Int32, StringSplitOptions verwenden) Überlastung? (http://msdn.microsoft.com/en-us/library/1bwe3zdy.aspx). Dies gilt nur für .NET 2.0 und höher, aber im Folgenden finden Sie genau das Ergebnis, nach dem das OP gefragt hat: yourString.Split (new string [] {":"}, 2, StringSplitOptions.None) – bernhof

+0

@Bernhof: tut es. Ich bin nicht sicher, was im Falle von zusätzlichen Leerzeichen (oder keine Leerzeichen) in der Zeichenfolge jedoch passieren soll. Der beste Ansatz unterscheidet sich je nach gewünschtem Verhalten ein wenig. – Thorarin

+2

Ich finde es sehr verwirrend, dass etwas wie yourString.Split (':', 2); funktioniert nicht ... Danke für deine Erklärungen! – Sebastian

12

die Suche über Sie spalten könnten „:“ (dh Doppelpunkt mit Leerzeichen am Ende), da dies scheint Sei was du getan hast. Wenn Sie sich wirklich auf den ersten Delimeter aufgeteilt haben, sehen Sie ein führendes Leerzeichen in Ihrem zweiten Array-Element.

Allerdings sollten Sie wahrscheinlich in dieser Überlastung von Split suchen ...

http://msdn.microsoft.com/en-us/library/c1bs0eda.aspx

public string[] Split(
    char[] separator, 
    int count 
) 

... die Ihnen eine maximale Anzahl von Teil angeben können.

3
?("Time: 10:12:12\r\n").Split(new char[] { ':', ' ' }, 2, 
    StringSplitOptions.RemoveEmptyEntries) 
{Dimensions:[2]} 
    [0]: "Time" 
    [1]: "10:12:12\r\n" 

andere Optionen:

?("Time: 10:12:12\r\n").Split(new char[] { ':' }, 2) 
{Dimensions:[2]} 
    [0]: "Time" 
    [1]: " 10:12:12\r\n" 
?("Time: 10:12:12\r\n").Split(new char[] { ':' }, 1) 
{Dimensions:[1]} 
    [0]: "Time: 10:12:12\r\n" 
?("Time: 10:12:12\r\n").Split(new char[] { ':' }, 3) 
{Dimensions:[3]} 
    [0]: "Time" 
    [1]: " 10" 
    [2]: "12:12\r\n" 
+0

Das Delimeter ist Doppelpunkt, nicht Leerzeichen. Du hast Recht, dass das Teilen auf den Platz gut wäre und zwei Elemente geben würde, aber ich denke nicht, dass das die Frage ist, die gestellt wird. –

+0

yah, beobachtet, behoben – serhio

+0

Tatsächlich gibt es hier ein 4-Elemente-Array zurück ... – Thorarin

1

ich eine Änderung angenommen haben, um Thorarin's Antwort oben, Die unten genannten sollten in der Lage sein, mit Ihrer Anforderung umzugehen, plus die Leerzeichen zuzuschneiden.

yourString.Split(new []{'-'},2).Select(s => s.Trim()) 
Verwandte Themen