2010-07-15 5 views
7

que tiene una cadena de este modo:C# Cadena división - rompiendo cuerda hacia arriba en segunda coma

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

myarray puede ser de longitud variable. Lo que me gustaría hacer es dividir la cadena de la siguiente manera:

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

¿Esto es posible? Intenté string[] newArray = mystring.Split(',') pero eso se divide en cada coma, y ​​no en la segunda coma, que es lo que me gustaría hacer.

Zaps

Respuesta

8

Se puede utilizar una expresión regular para que coincida con dos elementos de la cadena:

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

Esto obtiene los elementos de la primera cadena de la matriz. No sé por qué tiene la cadena en una matriz y si tiene más de una cadena, en ese caso debe recorrerlas y obtener los elementos de cada cadena.

+0

Me gusta esto. Creo que es más legible (es decir, sin matemáticas) y menos propenso a errores de uno, etc. +1 – spender

+0

Una expresión regular algo más simple es @ "\ w +, \ s + \ w +" –

+0

@Jim: Sí, funciona para el específico string en el ejemplo, pero falla, por ejemplo, con '" test, 1, lost + found, 2 "' o '" test, 1,, 2 "'. – Guffa

1

No con Split solo, pero sin duda puede lograrse

Gracias por su ayuda.

Supongo que myarray es realmente una cadena, y no una matriz ...?

En ese caso, tal vez podría hacer algo como esto:

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

disculpas - sí myarray es una cadena. Actualizaré la pregunta –

4

No hay forma directa de hacer String.split hacer esto.

Si el rendimiento no es una preocupación, puede utilizar 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(); 

De lo contrario es probable que tenga que dividir la cadena de forma manual utilizando String.IndexOf, o el uso de una expresión regular.

+0

+1 porque 'Zip' es excelente. esto solo funcionará en 4.0+ tho. –

1

Probablemente pueda utilizar una expresión regular en la cadena original para reemplazar las demás coma con un 'token' diferente, p. Ej. ';' Entonces simplemente llame a string.split en el nuevo token.

2

Otra solución basada en LINQ aquí. (Quizás no sea el más eficiente, pero permite un código conciso y funciona para agrupar en tamaños de grupos arbitrarios).


1) definir un nuevo operador de consulta, 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 segundo lugar, se aplica a su entrada:

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

Interesante pregunta ... Lo haría así:

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

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

Obtiene exactamente lo que desea. Solo su sucio ...= P =)

0

usando 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); 
     } 

:)

Cuestiones relacionadas