2010-07-15 3 views
7

J'ai une chaîne comme ceci:C# division String - chaîne rupture à la deuxième virgule

mystring = "test1, 1, anotherstring, 5, yetanother, 400"; 

myarray peut être plus ou moins longue. Ce que je voudrais faire est de diviser la chaîne comme autant:

{"test1, 1"} 
{"anotherstring, 5} 
{"yetanother, 400"} 

Est-ce possible? J'ai essayé string[] newArray = mystring.Split(',') mais cela le divise à chaque virgule, et pas la deuxième virgule qui est ce que je voudrais faire.

Merci pour votre aide

Zaps

Répondre

8

Vous pouvez utiliser une expression régulière pour correspondre à deux éléments dans la chaîne:

string[] parts = 
    Regex.Matches(myarray[0], "([^,]*,[^,]*)(?:, |$)") 
    .Cast<Match>() 
    .Select(m => m.Groups[1].Value) 
    .ToArray(); 

Cette obtient les éléments de la première chaîne dans le tableau. Je ne sais pas pourquoi vous avez la chaîne dans un tableau et si vous avez plus d'une chaîne, dans ce cas vous devez les parcourir et obtenir les éléments de chaque chaîne.

+0

J'aime ça. Je pense qu'il est le plus lisible (c.-à-d. Pas de maths) et le moins enclin à éteindre par un bugs etc. +1 – spender

+0

Une expression régulière un peu plus simple est @ "\ w +, \ s + \ w +" –

+0

@Jim: Oui, cela fonctionne pour le spécifique chaîne dans l'exemple, mais échoue par exemple avec '" test, 1, lost + found, 2 "' ou '" test, 1,, 2 "'. – Guffa

1

pas avec Split seul, mais il peut certainement être atteint.

Je suppose que myarray est réellement une chaîne, et non un tableau ...?

Dans ce cas, vous pourriez peut-être faire quelque chose comme ceci:

string myarray = "test1, 1, anotherstring, 5, yetanother, 400"; 

string[] sourceArray = myarray.Split(','); 
string[] newArray = sourceArray.Select((s,i) => 
    (i % 2 == 0) ? "" : string.Concat(sourceArray[i-1], ",", s).Trim() 
).Where(s => !String.IsNullOrEmpty(s)).ToArray(); 
+0

excuses - oui myarray est une chaîne. Je vais mettre à jour la question –

4

Il n'y a aucun moyen direct de faire String.Split faire.

Si les performances ne sont pas un problème, vous pouvez utiliser LINQ:

var input = "test1, 1, anotherstring, 5, yetanother, 400"; 

string[] result = input.Split(','); 
result = result.Where((s, i) => i % 2 == 0) 
       .Zip(result.Where((s, i) => i % 2 == 1), (a, b) => a + ", " + b) 
       .ToArray(); 

Sinon, vous aurez probablement à diviser la chaîne manuellement à l'aide String.indexOf, ou en utilisant une expression régulière.

+0

+1 parce que 'Zip' est excellent. cela ne fonctionnera que dans 4.0+ tho. –

1

Vous pourriez probablement utiliser une expression régulière sur la chaîne d'origine pour remplacer toutes les autres virgules par un 'jeton' différent, par ex. ';' Appelez ensuite string.split sur le nouveau jeton à la place.

2

Une autre solution basée sur LINQ ici. (Peut-être pas le plus efficace, mais il permet un code concis et fonctionne pour le regroupement dans des tailles de groupe arbitraires).


1) Définir un nouvel opérateur de requête, InGroupsOf:

public static IEnumerable<T[]> InGroupsOf<T>(this IEnumerable<T> parts, 
              int groupSize) 
{ 
    IEnumerable<T> partsLeft = parts; 
    while (partsLeft.Count() >= groupSize) 
    { 
     yield return partsLeft.Take(groupSize).ToArray<T>(); 
     partsLeft = partsLeft.Skip(groupSize); 
    } 
} 

2) En second lieu, l'appliquer à votre entrée:

// define your input string: 
string input = "test1, 1, anotherstring, 5, yetanother, 400"; 

// split it, remove excessive whitespace from all parts, and group them together: 
IEnumerable<string[]> pairedInput = input 
            .Split(',') 
            .Select(part => part.Trim()) 
            .InGroupsOf(2); // <-- used here! 

// see if it worked: 
foreach (string[] pair in pairedInput) 
{ 
    Console.WriteLine(string.Join(", ", pair)); 
} 
0

Question intéressante ... Je le ferais comme ceci:

string input = "test1, 1, anotherstring, 5, yetanother, 400"; 
string pattern = @"([^,]*,[^,]*),"; 

string[] substrings = Regex.Split(input, pattern).Where(s => s!="").Select(s => s.Trim()).ToArray(); 

Vous obtenez exactement ce que vous voulez. Seulement son sale ...= P =)

0

utilisant IEnumerator ..

 var myarray = "test1, 1, anotherstring, 5, yetanother, 400"; 
     System.Collections.IEnumerator iEN = myarray.Split(',').GetEnumerator(); 
     var strList = new List<string>(); 
     while (iEN.MoveNext()) 
     { 
      var first = iEN.Current; 
      iEN.MoveNext(); 
      strList.Add((string)first + "," + (string)iEN.Current); 
     } 

:)

Questions connexes