String.Split solo en el primer separador en C #?

78

String.Split es conveniente para dividir una cadena con varias partes en un delimitador.

¿Cómo debo seguir dividiendo una cadena solo en el primer delimitador? Por ejemplo, tengo una cuerda

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

Y querría una matriz que pareciera

{"Time","10:12:12\r\n"}
Seudónimo
fuente
dividir usando espacios en blanco? y establezca un arry = yourString.Split ('');
Ramgy Borja
1
@RamgyBorja eso no funcionará a menos que también recorte el :de Timey de todos modos, no lo que se preguntó
smurtagh
@smurtagh sí, para codificación segura se utilizó el recorte
Ramgy Borja

Respuestas:

146

El mejor enfoque depende un poco de cuán flexible desee que sea el análisis, con respecto a posibles espacios adicionales y demás. Verifique las especificaciones de formato exactas para ver lo que necesita.

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

Te limitará a 2 subcadenas. Sin embargo, esto no recorta el espacio al comienzo de la segunda cadena. Sin embargo, podría hacerlo en una segunda operación después de la división.

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

Debería funcionar, pero se romperá si intenta dividir un nombre de encabezado que contiene un espacio.

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

Hará exactamente lo que usted describe, pero en realidad requiere que el espacio esté presente.

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

Hace que el espacio sea opcional, pero aún tendrá que hacerlo TrimStart()en caso de que haya más de un espacio.

Para mantener el formato algo flexible y su código legible, sugiero usar la primera opción:

string[] split = yourString.Split(new char[] { ':' }, 2);
// Optionally check split.Length here
split[1] = split[1].TrimStart();
Thorarin
fuente
¿Por qué no utilizar la sobrecarga (String [], Int32, StringSplitOptions)? ( msdn.microsoft.com/en-us/library/1bwe3zdy.aspx ). Esto solo se aplica a .NET 2.0 y superior, pero lo siguiente da exactamente el resultado que pedía el OP: yourString.Split (new string [] {":"}, 2, StringSplitOptions.None)
bernhof
@Bernhof: lo hace. Sin embargo, no estoy seguro de qué debería suceder en caso de espacios adicionales (o sin espacios) en la cadena. El mejor enfoque difiere un poco según el comportamiento deseado.
Thorarin
2
Me resulta muy confuso que algo como yourString.Split (':', 2); no funciona ... Gracias por tus explicaciones!
Sebastián
1
.Select(s=> s.Trim())Así es como a menudo
recorto
14

En su ejemplo anterior, podría dividir en ":" (es decir, dos puntos con espacio al final) ya que esto parece ser lo que ha hecho. Si realmente dividiera solo en el primer delímetro, vería un espacio inicial en su segundo elemento de matriz.

Sin embargo, probablemente deberías mirar esta sobrecarga de Split ...

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

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

... que le permite especificar un número máximo de subcadenas.

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

otras opciones:

?("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"
serhio
fuente
El delimitador es dos puntos, no espacio. Tienes razón en que dividir el espacio estaría bien y daría 2 elementos, pero no creo que esa sea la pregunta que se hace.
Martin Peck
1

Adopté una variación de la respuesta de Thorarin anterior, la siguiente debería poder cumplir con sus requisitos, además de recortar los espacios.

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