2010-02-11 28 views
452

He estado usando el método Split() para dividir cadenas, pero esto solo parece funcionar si está dividiendo una cadena por un carácter. ¿Hay alguna manera de dividir un string, con otra cadena dividida por parámetro? Intenté convertir el divisor en una matriz de caracteres, sin suerte.C# Dividir una cadena por otra cadena

En otras palabras, me gustaría dividir el string:

THExxQUICKxxBROWNxxFOX

por xx y devolver una matriz con los valores:

LA, rápido, BROWN, FOX

Respuesta

821

Para dividir por una cadena, deberá usar el string array overload.

string data = "THExxQUICKxxBROWNxxFOX"; 

return data.Split(new string[] { "xx" }, StringSplitOptions.None); 
+4

verdad es que acabé cambiando mi respuesta a esto por 2 razones: # 1: para hacer frente a las divisiones que quiero hacer yo tendría que usar Regex.Escape, porque mi Separar una cadena menudo contendrá asteriscos , etc. # 2: Si bien este programa que estoy escribiendo no necesita una optimización real, d Parece que los costes indirectos adicionales implican el uso del método Regex Split. – Brandon

+1

En mi defensa, Jon Skeet sugirió algún lugar para usar Regex al dividir cadenas con cadenas como separador, y tengo que admitirlo cuando sugiera algo. Tiendo a creer que rara vez es un mal consejo. ('Aunque es probable que desee dividir por cadena en lugar de caracteres, en cuyo caso, querrá ver Regex.Split') – Peter

+7

@Peter: en esa publicación Jon lo sugiere porque el cartel no tiene una dirección fija delimitador; él está buscando dividir cadenas separadas por "más de un espacio" (es decir, 2+). Para cadenas delimitadas por un * patrón * en lugar de un * valor *, RegEx es una gran opción (bueno, la * única *). Para los delimitadores de valores fijos, introduce una sobrecarga innecesaria. Intenta ejecutar una prueba; a medida que aumenta el número de operaciones, RegEx termina tomando alrededor de ~ 10x tan largo como un 'string.Split' correspondiente. –

52
Regex.Split(string,"xx") 

es la forma en que lo hago normalmente. Por supuesto, se necesita un

using System.Text.RegularExpressions; 

pero de nuevo Necesito que lib todo el tiempo.

+7

@Brandon: Aunque normalmente advierto contra la optimización prematura, debe tener en cuenta que un 'RegEx.Split' es bastante más costoso que un simple' String.Split' debido a la sobrecarga de expresiones regulares. –

+7

Si desea dividir por una cadena arbitraria, use 'Regex.Escape' en la cadena primero, esto escapará a cualquier metacaraculo de expresiones regulares. – Richard

+0

una de las ventajas clave que pueden pagar los gastos generales es la capacidad de proporcionar la configuración de comparación de cadenas –

85

Hay un overload of Split que lleva cadenas.

"THExxQUICKxxBROWNxxFOX".Split(new [] { "xx" }, StringSplitOptions.None); 

Puede utilizar cualquiera de estos StringSplitOptions

  • Ninguno - El valor de retorno incluye elementos de la matriz que contienen una cadena vacía
  • RemoveEmptyEntries - El valor de retorno no incluye los elementos de matriz que contienen una cadena vacía

Así que si la cadena es "THExxQUICKxxxxBROWNxxFOX", StringSplitOptions.None devolverá una entrada vacía en la matriz para la parte "xxxx", mientras que StringSplitOptions.RemoveEmptyEntries no lo hará.

+1

No es necesario especificar una cadena después de las nuevas: '" THExxQUICKxxBROWNxxFOX ".Split (new [] {" xx "}, StringSplitOptions. Ninguno); ' funcionará. – JayJay

+0

Reparado, gracias. El código viejo era viejo. – Greg

35

Hay una sobrecarga de String.Split para esto:

"THExxQUICKxxBROWNxxFOX".Split(new [] {"xx"}, StringSplitOptions.None); 
+1

La única respuesta que elimina la declaración de tipo de matriz innecesaria. – wonea

16

general, me gusta usar mi propia extensión para que:

string data = "THExxQUICKxxBROWNxxFOX"; 
var dataspt = data.Split("xx"); 
//>THE QUICK BROWN FOX 


//the extension class must be declared as static 
public static class StringExtension 
{ 
    public static string[] Split(this string str, string splitter) 
    { 
     return str.Split(new[] { splitter }, StringSplitOptions.None); 
    } 
} 

Este será sin embargo conducir a una excepción, si Microsoft decide incluir este método-sobrecarga en versiones posteriores. También es la razón probable por la cual Microsoft no ha incluido este método mientras tanto: Al menos una empresa para la que trabajé usó dicha extensión en todos sus proyectos de C#.

También es posible definir condicionalmente el método en tiempo de ejecución si no existe.

+1

Alternativamente, use 'params string [] splitter' como el segundo parámetro y cambie' new [] {splitter} 'a' splitter' para admitir múltiples delimitadores. –

0

La forma más sencilla es utilizar String.Replace:

string myString = "THExxQUICKxxBROWNxxFOX"; 
mystring = mystring.Replace("xx", ", "); 

O más simplemente:

string myString = "THExxQUICKxxBROWNxxFOX".Replace("xx", ", "); 
+2

Como está, esto no devolverá una matriz (como lo pide la pregunta), solo una cadena con comas donde estaban los 'xx'. – Arj

+0

Y no solo eso, si la cadena contiene comas adicionales, no podrá dividir las palabras correctamente. – user3658298

4
string data = "THExxQUICKxxBROWNxxFOX"; 

return data.Replace("xx","|").Split('|'); 

simplemente selecciona el personaje vuelva a colocar cuidadosamente (elegir uno que no es probable que se presente en la cuerda ya)

+0

¿Por qué esta respuesta downvoted? – kobe

+2

@MasoudHosseini: lea la respuesta completa; ya hay un descargo de responsabilidad. – SNag

+1

@kobe: Porque es un hack terrible. – Overv

3

Las respuestas anteriores son todas correctas. Voy un paso más allá y hacer C# trabajo para mí mediante la definición de un método de extensión de la secuencia:

public static string[] Split(this string toSplit, string splitOn) { 
    return toSplit.Split(new string[] { splitOn }, StringSplitOptions.None); 
} 

De esa manera puedo llamar en cualquier cadena en la simple forma en que ingenuamente esperaba que la primera vez que trataba de lograr esto :

"a big long string with stuff to split on".Split("g str");