9
votes

C # String String Splitting - Carriser String Up à la deuxième virgule

J'ai une chaîne comme si: xxx

myarray peut être de longueur variable. Ce que je voudrais faire, c'est diviser la chaîne comme suit: xxx

est-ce possible? J'ai essayé string [] Newarray = mystring.split (',') mais cela le divise à chaque virgule, et non la deuxième virgule qui est ce que j'aimerais faire. < p> Merci pour votre aide

zaps


0 commentaires

7 Réponses :


1
votes

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

Je suppose que myARRAY est en fait une chaîne, et non un tableau ...?

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


1 commentaires

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



5
votes

Il n'y a pas de moyen direct de faire chaîne.split faire cela.

Si la performance n'est pas une préoccupation, vous pouvez utiliser LINQ: P>

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();


1 commentaires

+1 parce que zip est excellent. Cela ne fonctionnera que dans 4.0+ Tho.



10
votes

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

Ceci obtient les éléments de la première chaîne de la matrice. 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 boucler et obtenir les articles de chaque chaîne.


6 commentaires

J'aime ça. Je pense que c'est le plus lisible (c'est-à-dire pas de mathématiques) et le moins enclins à éteindre par un bugs, etc. +1


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


@JIM: Oui, cela fonctionne pour la chaîne spécifique dans l'exemple, mais échoue par exemple avec "Test, 1, perdu + trouvé, 2" ou "Test, 1, 2" .


Peut-être que cela signifie que les valeurs avec des caractères, des espaces, des valeurs vides et similaires ne le rendront pas. La regex de Guffa permet de tout sauf virgule, ce qui est meilleur imo.


En fait, @guffa, vous sélectionnez tout le match qui comprend une virgule de fuite. Mieux vaut. Sélectionner (m => m.groups [1] .value) à la place.


@Spender: Oui, vous avez raison. C'est ce que je fais habituellement, j'ai raté cette fois cette fois.



1
votes

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


0 commentaires

2
votes

Une autre solution à base de Linq ici. (Peut-être pas le plus efficace, mais il permet un code concis et fonctionne pour le regroupement de formats de groupe arbitraires).


1) strong> Définissez un nouvel opérateur de requête, Ingroupes de Code>: p> xxx pré>


2) strong> second, appliquez-le à votre entrée: p>

// 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 commentaires

1
votes

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();


0 commentaires

0
votes

Utilisation d'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);
       }


0 commentaires