Dividir una cadena por otra cadena en C #
Frecuentes
Visto 524,659 equipos
747
He estado usando el 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.
En otras palabras, me gustaría dividir el string
:
ELxxQUICKxxBROWNxxFOX
by xx
y devuelve una matriz con valores:
EL VELOZ ZORRO MARRÓN
10 Respuestas
1346
Para dividir por una cadena, tendrá que usar el sobrecarga de matriz de cadenas.
string data = "THExxQUICKxxBROWNxxFOX";
return data.Split(new string[] { "xx" }, StringSplitOptions.None);
Respondido 11 Feb 10, 15:02
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 Lo que estoy escribiendo no necesita una optimización real, parece haber una sobrecarga adicional involucrada con el uso del método Regex Split. - Brandon
@Peter: En esa publicación, Jon lo sugiere porque el cartel 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 preferible a propuesta de, La expresión regular es excelente (bueno, la , solamente) opción. Para los delimitadores de valor fijo, introduce una sobrecarga innecesaria. Intente ejecutar una prueba; a medida que aumenta el número de operaciones, la expresión regular termina tomando alrededor de ~ 10 veces más tiempo que un string.Split
. - adam robinson
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 a string[] Split(string pattern)
, que es el uso más natural que se me ocurre, pero no está ahí. Escribí C antes, así que estoy acostumbrado a las matrices de caracteres, pero todavía odio ver char[]
apareciendo en un código C # porque de repente atrae mi atención del nivel de flujo 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 intentar apreciarla a pesar de las molestias. - previsorj
Este fragmento ocupa un lugar muy alto en la lista de cosas de las que me avergonzaría mostrarle a los desarrolladores que no son de C #. - Traubenfuchs
¿Por qué diablos no podemos simplemente hacer? data.Split("xx")
? - mcont
127
Hay un sobrecarga de Split eso toma cuerdas.
"THExxQUICKxxBROWNxxFOX".Split(new [] { "xx" }, StringSplitOptions.None);
Puede utilizar cualquiera de estas StringSplitOptions
- Ninguna - El valor de retorno incluye elementos de matriz que contienen una cadena vacía.
- Quitar entradas vacías - El valor de retorno no incluye elementos de matriz que contienen una cadena vacía
Entonces, si la cadena es "THExxQUICKxxxxBROWNxxFOX", StringSplitOptions.None
devolverá una entrada vacía en la matriz para la parte "xxxx" mientras StringSplitOptions.RemoveEmptyEntries
no lo hare
respondido 14 mar '17, 19:03
No "toma" cuerdas del todo. Espera una matriz de caracteres, simplemente usó el constructor literal para esto. - Sven Mawby
79
Regex.Split(string, "xx")
es la forma en que lo hago normalmente.
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.
Respondido el 16 de enero de 20 a las 21:01
@Brandon: Si bien generalmente 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 las expresiones regulares. - adam robinson
Si desea dividir por una cadena arbitraria, use Regex.Escape
en la cadena primero, esto escapará de los metacaracteres de expresiones regulares. - Richard
una de las ventajas clave que pueden pagar los gastos generales es la capacidad de proporcionar una configuración de comparación de cadenas: timur sadykov
48
Hay una sobrecarga de Cadena.Dividir para esto:
"THExxQUICKxxBROWNxxFOX".Split(new [] {"xx"}, StringSplitOptions.None);
Respondido 11 Feb 10, 15:02
La única respuesta que elimina la declaración innecesaria del tipo de matriz. - mujer
26
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 dará lugar a una excepción, si Microsoft decide incluir esta sobrecarga de método 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é, 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.
Respondido el 26 de Septiembre de 13 a las 10:09
Alternativamente, use params string[] splitter
como segundo parámetro y cambiar new[] {splitter}
a splitter
para admitir varios delimitadores. - Mateo Strawbridge
11
A partir de .NET Core 2.0, hay una invalidación que toma una cadena.
Entonces ahora puedes hacer "THExxQUICKxxBROWNxxFOX".Split("xx")
.
contestado el 24 de mayo de 19 a las 02:05
10
Las respuestas anteriores son todas correctas. Doy un paso más y hago que C # funcione para mí definiendo un método de extensión en cadena:
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");
contestado el 06 de mayo de 20 a las 12:05
7
string data = "THExxQUICKxxBROWNxxFOX";
return data.Replace("xx","|").Split('|');
Simplemente elija el carácter de reemplazo con cuidado (elija uno que no sea probable que ya esté presente en la cadena).
Respondido 04 Jul 14, 21:07
@MasoudHosseini: Lea la respuesta completa; ya hay un descargo de responsabilidad. - Engancharse
@kobe: Porque es un truco terrible. - Sobrev
Funciona bien, pero es peligroso para los métodos genéricos. Kaizonaro
Publicar explicaciones como "Es un truco terrible" o "una mala respuesta" no es útil. Es simplemente una opinión sin explicación. En su lugar, decir algo como "No es necesario escanear la cadena en busca de reemplazos y luego buscar caracteres divididos, ya que conduce a un rendimiento deficiente". sería una mejor manera de explicarte. Demasiados programadores actúan de esta manera. :( - matt ruwe
¿Qué pasa si la cadena contiene el |
char ya, 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);
Respondido el 21 de Septiembre de 18 a las 16:09
Pero esto también se dividiría "THExQUICK"
donde no queremos que se divida - Rafalon
Gracias Rafalon: sí, Greg es la mejor respuesta: data.Split (nueva cadena [] {"xx"}, StringSplitOptions.RemoveEmptyEntries) - user890255
-4
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", ", ");
respondido 26 mar '14, 13:03
Tal como está, esto no devolverá una matriz (como pide la pregunta), solo una cadena con comas donde el xx
fueron. - Arj
Y no solo que si la cadena contuviera comas adicionales, no podría dividir las palabras correctamente. - user3658298
Sin embargo, está en algo. Si también lo encadena con un split. Dudo que sea eficaz, pero es más legible .. var myStrings = "THExxQUICKxxBROWNxxFOX" .Replace ("xx", "|"). Split ('|'); - Terje Solem
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c# .net string split or haz tu propia pregunta.
Para futuras inquietudes: Uno de los comentarios a continuación me interesó, así que decidí abrir una discusión sobre ingeniería de software en relación con no intuitivo (pero correcta) forma de hacerlo en la respuesta aceptada. - scharette