2010-01-07 3 views
69

String.Split est pratique pour diviser une chaîne avec plusieurs parties sur un délimiteur.Chaîne.Split uniquement sur le premier séparateur en C#?

Comment dois-je continuer à diviser une chaîne uniquement sur le premier délimiteur. Par exemple. J'ai une chaîne

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

Et je veux un tableau ressemblant à

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

divisé en utilisant des espaces? et définissez arry = yourString.Split (''); –

+1

@RamgyBorja qui ne fonctionnera pas à moins qu'il ne supprime également le ':' de 'Time' et de toute façon, pas ce qui a été demandé – smurtagh

+0

@smurtagh oui, pour le codage de sécurité utilisé trim –

Répondre

128

La meilleure approche dépend un peu de la flexibilité que vous souhaitez pour l'analyse, en ce qui concerne les espaces supplémentaires possibles et autres. Vérifiez les spécifications de format exactes pour voir ce dont vous avez besoin.

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

Vous limiterez deux sous-chaînes. Cependant, cela ne réduit pas l'espace au début de la deuxième chaîne. Vous pourriez le faire dans une seconde opération après la séparation cependant.

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

Fonctionne, mais va se casser si vous essayez de diviser un nom d'en-tête qui contient un espace.

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

Fera exactement ce que vous décrivez, mais nécessite réellement l'espace pour être présent.

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

rend l'espace en option, mais vous auriez encore à TrimStart() en cas de plus d'un espace.

Pour conserver le format un peu flexible, et votre code lisible, je suggère d'utiliser la première option:

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

Pourquoi ne pas utiliser le (String [], Int32, StringSplitOptions) surcharge? (http://msdn.microsoft.com/en-us/library/1bwe3zdy.aspx). Ceci s'applique seulement à .NET 2.0 et au-dessus, mais ce qui suit donne exactement le résultat demandé par l'OP: yourString.Split (nouvelle chaîne [] {":"}, 2, StringSplitOptions.None) – bernhof

+0

@Bernhof: c'est le cas. Je ne suis pas sûr de ce qui devrait arriver en cas d'espaces supplémentaires (ou pas d'espaces) dans la chaîne cependant. La meilleure approche diffère un peu en fonction du comportement souhaité. – Thorarin

+2

Je trouve très déroutant que quelque chose comme yourString.Split (':', 2); ne fonctionne pas ... Merci pour vos explications! – Sebastian

12

Dans votre exemple ci-dessus, vous pouvez partager sur « : » (c.-à-deux points avec l'espace de fuite) comme cela semble Sois ce que tu as fait. Si vous ne divisiez réellement que le premier délimiteur, vous verriez un premier espace dans votre second élément de tableau.

Cependant, vous devriez probablement à cette surcharge de Split ...

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

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

... qui vous permet de spécifier un nombre maximum de sous-chaînes.

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

autres options:

?("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

Le délimiteur est deux-points, pas d'espace. Vous avez raison de dire que la division de l'espace serait bonne et qu'elle donnerait deux éléments, mais je ne pense pas que la question soit posée. –

+0

yah, observé, corrigé – serhio

+0

En fait, il retourne un tableau de 4 éléments ici ... – Thorarin

1

J'ai adopté une variation de La réponse de Thorarin ci-dessus, Le ci-dessous devrait être en mesure de gérer vos besoins, plus réduire les espaces.

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