¿Cómo divido una cadena por un delimitador de varios caracteres en C #?

232

¿Qué sucede si quiero dividir una cadena usando un delimitador que es una palabra?

Por ejemplo, This is a sentence.

Quiero dividir isy obtener Thisy a sentence.

En Java, puedo enviar una cadena como delimitador, pero ¿cómo puedo lograr esto C#?

Saobi
fuente

Respuestas:

281

http://msdn.microsoft.com/en-us/library/system.string.split.aspx

Ejemplo de los documentos:

string source = "[stop]ONE[stop][stop]TWO[stop][stop][stop]THREE[stop][stop]";
string[] stringSeparators = new string[] {"[stop]"};
string[] result;

// ...
result = source.Split(stringSeparators, StringSplitOptions.None);

foreach (string s in result)
{
    Console.Write("'{0}' ", String.IsNullOrEmpty(s) ? "<>" : s);
}
bruno conde
fuente
77
En realidad, esto devuelve: 'Th' '' 'una oración' con el ejemplo dado en la pregunta. Quizás esto es lo que realmente quiere, pero no es lo que especificó.
IRBMe el
66
Esto es solo un ejemplo ... El punto es: hay una String.Split que toma las cadenas como delimitadores.
bruno conde
1
Sí, pero no hace lo que especifica la pregunta. Tienes que usar algo un poco más inteligente para obtener la salida especificada. Ahora, si lo que la pregunta especificada es realmente lo que quiere el autor de la pregunta es una pregunta diferente, pero la pregunta que se hace aquí no se puede responder trivialmente con solo String.Split.
IRBMe el
3
Todavía no funciona del todo. Si incluye los espacios en la palabra para dividir, no se incluyen en la salida. Si examina el ejemplo dado en la pregunta, notará que de hecho incluyen los espacios. Dividir en "es" le daría "Esto" y "una oración" en lugar de "Esto" y "una oración". Tenga en cuenta los espacios sutiles al final de "Esto" y al comienzo de "una oración". Una vez más, esta respuesta es probablemente lo que el interrogador realmente quiere, pero no es lo que preguntó y, repito, String.Split no lo resolverá trivialmente.
IRBMe el
2
@IRBMe, ¿has leído la pregunta? 'Quiero dividir en "es". Entonces obtendré "Esto" y "una oración" '. Ver los espacios en los resultados ??? Esto es exactamente lo que hace Split.
bruno conde
55

Puede usar el método Regex.Split , algo como esto:

Regex regex = new Regex(@"\bis\b");
string[] substrings = regex.Split("This is a sentence");

foreach (string match in substrings)
{
   Console.WriteLine("'{0}'", match);
}

Editar : esto satisface el ejemplo que diste. Tenga en cuenta que un String.Split ordinario también se dividirá en el " es " al final de la palabra "Esto", por lo tanto, utilicé el método Regex e incluí los límites de las palabras alrededor del " es ". Sin embargo, tenga en cuenta que si acaba de escribir este ejemplo por error, entonces String.Split probablemente será suficiente.

IRBMe
fuente
@ EDITAR: tampoco estaba seguro, pero aún puede usar la división de cadena normal y solo rellenar espacios a ambos lados si su objetivo es eliminar SOLO la palabra "es".
ahawker
1
Eso tampoco funciona (al menos no sin mucho más esfuerzo), porque no sabes si el espacio debe ir a la izquierda, a la derecha o a ambas sin saber las posiciones de la palabra dividida en la cadena .
IRBMe el
Parece demasiado complicado como String.Splity le permite dividir en una cadena ya ...
Ed S.
3
Ya he abordado esto en mi edición a mi respuesta, en el comentario anterior y en 3 comentarios sobre otra respuesta. String.Split no funciona para el ejemplo proporcionado en la pregunta. No voy a repetirme una vez más explicando por qué. Puede leer todos los otros comentarios si desea saber.
IRBMe el
tenga en cuenta que el método de división de expresiones regulares no elimina delimitador previo y delimitador final en la variable ... :(
melaos
34

Según las respuestas existentes en esta publicación, esto simplifica la implementación :)

namespace System
{
    public static class BaseTypesExtensions
    {
        /// <summary>
        /// Just a simple wrapper to simplify the process of splitting a string using another string as a separator
        /// </summary>
        /// <param name="s"></param>
        /// <param name="pattern"></param>
        /// <returns></returns>
        public static string[] Split(this string s, string separator)
        {
            return s.Split(new string[] { separator }, StringSplitOptions.None);
        }


    }
}
eka808
fuente
99
+1, esto grita por un método de extensión. Casi tonto que esta no sea una de las sobrecargas incorporadas.
Todd Menier
99
@ToddMenier ¿Qué quieres decir con "casi"?
mwardm
28
string s = "This is a sentence.";
string[] res = s.Split(new string[]{ " is " }, StringSplitOptions.None);

for(int i=0; i<res.length; i++)
    Console.Write(res[i]);

EDITAR: El "es" se rellena en ambos lados con espacios en la matriz para preservar el hecho de que solo desea que la palabra "se" elimine de la oración y la palabra "esto" permanezca intacta.

ahawker
fuente
8

...En breve:

string[] arr = "This is a sentence".Split(new string[] { "is" }, StringSplitOptions.None);
ParPar
fuente
5

Puede usar String.Replace () para reemplazar su cadena dividida deseada con un carácter que no aparece en la cadena y luego usar String.Split en ese carácter para dividir la cadena resultante para el mismo efecto.

Paul Sonier
fuente
5

O usa este código; (mismo: nueva cadena [])

.Split(new[] { "Test Test" }, StringSplitOptions.None)
Cagdas
fuente
3

Aquí hay una función de extensión para hacer la división con un separador de cadenas:

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

Ejemplo de uso:

string mystring = "one[split on me]two[split on me]three[split on me]four";
var splitStrings = mystring.Split("[split on me]");
SteveD
fuente
0
var dict = File.ReadLines("test.txt")
               .Where(line => !string.IsNullOrWhitespace(line))
               .Select(line => line.Split(new char[] { '=' }, 2, 0))
               .ToDictionary(parts => parts[0], parts => parts[1]);


or 

    enter code here

line="[email protected][email protected]";
string[] tokens = line.Split(new char[] { '=' }, 2, 0);

ans:
tokens[0]=to
token[1]=xxx@gmail.com=yyy@yahoo.co.in
Prabu
fuente
-5
string strData = "This is much easier"
int intDelimiterIndx = strData.IndexOf("is");
int intDelimiterLength = "is".Length;
str1 = strData.Substring(0, intDelimiterIndx);
str2 = strData.Substring(intDelimiterIndx + intDelimiterLength, strData.Length - (intDelimiterIndx + intDelimiterLength));
Susmeet Khaire
fuente
19
Antes de publicar el código, probablemente debería intentar ejecutarlo primero a través de un compilador, a menos que denote que no lo ha hecho. Falta un punto y coma en la primera línea, y str1 y str2 no están definidos. Sin mencionar que el código en realidad no funciona como quería el OP. Este código lo divide en "Th" y "es mucho más fácil".
mandreko