78 votes

String.Split uniquement sur le premier séparateur en C# ?

String.Split est pratique pour diviser une chaîne de caractères en plusieurs parties sur un délimiteur.

Comment dois-je procéder pour diviser une chaîne de caractères uniquement sur le premier délimiteur. Par exemple, j'ai une chaîne

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

Et je voudrais un tableau ressemblant à

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

148voto

Thorarin Points 21538

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

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

Vous limitera à deux sous-chaînes. Cependant, cela ne coupe pas l'espace au début de la deuxième chaîne. Vous pouvez cependant le faire dans une deuxième opération après le fractionnement.

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

Devrait fonctionner, mais se brisera 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 en fait la présence de l'espace.

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

L'espace est facultatif, mais il faut quand même TrimStart() dans le cas de plus d'un espace.

Pour que le format reste flexible et que votre code soit lisible, je vous 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();

14voto

Martin Peck Points 8078

Dans votre exemple ci-dessus, vous pourriez séparer sur " : " (c'est-à-dire deux-points avec espace de fin), car cela semble être ce que vous avez fait. Si vous avez vraiment divisé sur le premier délimiteur, vous verrez un espace avant dans votre deuxième élément de tableau.

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

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

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

3voto

serhio Points 9649
?("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"

1voto

spinalfrontier Points 60

J'ai adopté une variante de la réponse de Thorarin ci-dessus, La méthode ci-dessous devrait répondre à vos besoins, tout en supprimant les espaces.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X