Dividir una cadena por otra cadena en C #

681

He estado usando el Split()método 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 que es la división por parámetro?

Intenté convertir el divisor en una matriz de caracteres, sin suerte.

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

THExxQUICKxxBROWNxxFOX

por xxy devuelve una matriz con valores:

EL VELOZ ZORRO MARRÓN

Brandon
fuente
2
Para preocupaciones futuras: Uno de los comentarios a continuación me interesó, así que decidí abrir una discusión sobre ingeniería de software con respecto a la forma no intuitiva (pero correcta) de hacerlo en la respuesta aceptada.
scharette

Respuestas:

1238

Para dividir por una cadena, deberá usar la sobrecarga de la matriz de cadenas .

string data = "THExxQUICKxxBROWNxxFOX";

return data.Split(new string[] { "xx" }, StringSplitOptions.None);
Adam Robinson
fuente
44
De hecho, terminé cambiando mi respuesta a esto por 2 razones: # 1: Para manejar las divisiones que quiero hacer, necesitaría usar Regex.Escape, porque mi cadena dividida a menudo contendrá asteriscos, etc. # 2: Mientras este programa Estoy escribiendo que no necesita una optimización real, parece haber una sobrecarga adicional relacionada con el uso del método Regex Split.
Brandon
77
@ Peter: En esa publicación, Jon lo sugiere porque el póster no tiene un delimitador fijo; busca 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 excelente (bueno, la única ) opción. Para delimitadores de valor fijo, introduce una sobrecarga innecesaria. Intenta ejecutar una prueba; A medida que aumenta el número de operaciones, RegEx termina tomando alrededor de ~ 10 veces el tiempo que corresponda string.Split.
Adam Robinson
99
Vengo de Python a C #. Python admite cadenas divididas por otra cadena. Y con frecuencia necesito volver a esta pregunta para obtener una respuesta simple string[] Split(string pattern), que es el uso más natural que se me ocurre, pero aún no está allí. Escribí C antes, así que estoy acostumbrado a las matrices de caracteres, pero todavía odio ver char[]aparecer un código C # porque de repente me llama la atención del nivel de transmisión al nivel de bytes. ¿Alguien sabe por qué los chicos de la biblioteca C # diseñaron el método Split de esta manera? Si hay una buena razón, probablemente pueda tratar de apreciarla a pesar de las molestias.
foresightyj
11
Este fragmento ocupa un lugar muy alto en la lista de cosas que me daría vergüenza mostrar a los desarrolladores que no son C #.
Traubenfuchs
98
¿Por qué demonios no podemos simplemente hacer data.Split("xx")?
mcont
122

Hay una sobrecarga de Split que toma cadenas.

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

Puede usar cualquiera de estas StringSplitOptions

  • Ninguno : el valor de retorno incluye elementos de matriz que contienen una cadena vacía
  • RemoveEmptyEntries : el valor de retorno no incluye elementos de matriz que contengan una cadena vacía

Entonces, si la cadena es "THExxQUICKxxxxBROWNxxFOX", StringSplitOptions.Nonedevolverá una entrada vacía en la matriz para la parte "xxxx" mientras StringSplitOptions.RemoveEmptyEntriesque no lo hará.

Greg
fuente
73
Regex.Split(string, "xx")

es la forma en que lo hago habitualmente.


Por supuesto que necesitarás:

using System.Text.RegularExpressions;

o:

System.Text.RegularExpressions.Regex.Split(string, "xx")

pero, de nuevo, necesito esa biblioteca todo el tiempo.

Peter
fuente
13
@Brandon: Si bien generalmente estoy advirtiendo contra la optimización prematura, debe tener en cuenta que a RegEx.Splites bastante más costoso que simple String.Splitdebido a la sobrecarga de expresión regular.
Adam Robinson
99
Si desea dividir por una cadena arbitraria, use Regex.Escapeprimero en la cadena, esto escapará a los metacaracteres regex.
Richard
Una de las principales ventajas que pueden pagar los gastos generales es la capacidad de proporcionar una configuración de comparación de cadenas
Timur Sadykov,
47

Hay una sobrecarga de String.Split para esto:

"THExxQUICKxxBROWNxxFOX".Split(new [] {"xx"}, StringSplitOptions.None);
bruno conde
fuente
1
La única respuesta que elimina la declaración de tipo de matriz innecesaria.
wonea
25

Generalmente me gusta usar mi propia extensión para eso:

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

Sin embargo, esto conducirá a una excepción, si Microsoft decide incluir esta sobrecarga de métodos en versiones posteriores. También es la razón probable por la que Microsoft no ha incluido este método mientras tanto: al menos una empresa para la que trabajé, utilizó esa 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.

Lorenz Lo Sauer
fuente
44
Alternativamente, use params string[] splittercomo segundo parámetro y cambie new[] {splitter}a splitterpara admitir múltiples delimitadores.
Matthew Strawbridge
10

Las respuestas anteriores son todas correctas. Voy un paso más allá y hago que C # funcione para mí definiendo un método de extensión en String:

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

De esa manera puedo llamarlo en cualquier cadena de la manera simple que ingenuamente esperaba la primera vez que intenté lograr esto:

"a big long string with stuff to split on".Split("g str");
argyle
fuente
7
string data = "THExxQUICKxxBROWNxxFOX";

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

¡Simplemente elija el carácter de reemplazo con cuidado (elija uno que probablemente no esté presente en la cadena)!

Engancharse
fuente
2
@MasoudHosseini: Lea la respuesta completa; Ya hay un descargo de responsabilidad.
SNag
3
@kobe: Porque es un truco terrible.
Overv
3
Funciona bien, pero es peligroso para los métodos genéricos
Kaizonaro
55
Publicar explicaciones como "Es un truco terrible" o "una mala respuesta" no es útil. Es simplemente una opinión sin explicación. En cambio, indicando algo como "No es necesario escanear la cadena en busca de reemplazos y luego buscar caracteres divididos, ya que conduce a un bajo rendimiento". Sería una mejor manera de explicarte. Demasiados programadores actúan de esta manera. :(
Matt Ruwe
1
¿Qué pasa si la cadena ya contiene el |carácter? Por esta razón, creo que es peligroso de usar.
amd
-1

Esto también es fácil:

string data = "THExxQUICKxxBROWNxxFOX";
string[] arr = data.Split("xx".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
user890255
fuente
1
Pero esto también se dividiría "THExQUICK"donde no queremos que se
divida
Gracias Rafalon: sí, Greg es la mejor respuesta: data.Split (nueva cadena [] {"xx"}, StringSplitOptions.RemoveEmptyEntries)
usuario890255
-4

La forma más fácil es usar String.Replace:

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

O más simplemente:

string myString = "THExxQUICKxxBROWNxxFOX".Replace("xx", ", ");
usuario3458227
fuente
3
Tal como está, esto no devolverá una matriz (como la pregunta lo solicita), solo una cadena con comas donde xxestaban las 's.
Arj
Y no solo eso si la cadena contiene comas adicionales, no podrá dividir las palabras correctamente.
user3658298