String.Split nur beim ersten Trennzeichen in C #?

78

String.Split eignet sich zum Teilen eines Strings mit mehreren Teilen auf einem Trennzeichen.

Wie soll ich fortfahren, eine Zeichenfolge nur am ersten Trennzeichen aufzuteilen? ZB habe ich eine Schnur

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

Und ich möchte ein Array, das aussieht

{"Time","10:12:12\r\n"}
Anonym
quelle
mit Leerzeichen teilen? und setze einen arry = yourString.Split ('');
Ramgy Borja
1
@ RamgyBorja, das wird nicht funktionieren, es sei denn, er schneidet auch die :von Timeund sowieso nicht, was gefragt wurde
smurtagh
@smurtagh ja, für die sichere Codierung gebrauchte Trimmung
Ramgy Borja

Antworten:

146

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

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

Begrenzt Sie auf zwei 2 Teilzeichenfolgen. Dadurch wird jedoch das Leerzeichen am Anfang der zweiten Zeichenfolge nicht gekürzt. Sie können dies jedoch in einer zweiten Operation nach der Aufteilung tun.

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

Sollte funktionieren, wird aber unterbrochen, wenn Sie versuchen, einen Headernamen zu teilen, der ein Leerzeichen enthält.

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

Wird genau das tun, was Sie beschreiben, erfordert aber tatsächlich, dass der Raum vorhanden ist.

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

Macht den Speicherplatz optional, aber Sie müssen immer noch TrimStart()mehr als einen Speicherplatz verwenden.

Um das Format etwas flexibel und Ihren Code lesbar zu halten, empfehle ich die erste Option:

string[] split = yourString.Split(new char[] { ':' }, 2);
// Optionally check split.Length here
split[1] = split[1].TrimStart();
Thorarin
quelle
Warum nicht die Überladung (String [], Int32, StringSplitOptions) verwenden? ( msdn.microsoft.com/en-us/library/1bwe3zdy.aspx ). Dies gilt nur für .NET 2.0 und höher, aber das Folgende gibt genau das Ergebnis an, nach dem das OP gefragt hat: yourString.Split (neuer String [] {":"}, 2, StringSplitOptions.None)
bernhof
@Bernhof: das tut es. Ich bin mir jedoch nicht sicher, was bei zusätzlichen Leerzeichen (oder keinen Leerzeichen) in der Zeichenfolge passieren soll. Der beste Ansatz unterscheidet sich je nach gewünschtem Verhalten etwas.
Thorarin
2
Ich finde es sehr verwirrend, dass so etwas wie yourString.Split (':', 2); funktioniert nicht ... Danke für deine Erklärungen!
Sebastian
1
.Select(s=> s.Trim())So schneide ich oft die Ergebnisse von Split
AaronLS
14

In Ihrem obigen Beispiel könnten Sie nach ":" (dh Doppelpunkt mit Leerzeichen) teilen, da dies anscheinend das ist, was Sie getan haben. Wenn Sie wirklich nur das erste Delimeter geteilt haben, sehen Sie ein führendes Leerzeichen in Ihrem zweiten Array-Element.

Allerdings sollten Sie sich wahrscheinlich diese Überladung von Split ansehen ...

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

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

... mit dem Sie eine maximale Anzahl von Teilzeichenfolgen angeben können.

Martin Peck
quelle
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"
serhio
quelle
Das Delimeter ist Doppelpunkt, kein Leerzeichen. Sie haben Recht, dass das Aufteilen auf den Raum in Ordnung wäre und zwei Elemente ergeben würde, aber ich denke nicht, dass dies die Frage ist, die gestellt wird.
Martin Peck
1

Ich habe eine Variation von Thorarins Antwort oben übernommen. Das Folgende sollte in der Lage sein, Ihre Anforderungen zu erfüllen und die Leerzeichen zu kürzen.

yourString.Split(new []{'-'},2).Select(s => s.Trim())
Wirbelsäulengrenze
quelle