Como faço para dividir uma string por um delimitador de vários caracteres em C #?

232

E se eu quiser dividir uma string usando um delimitador que é uma palavra?

Por exemplo This is a sentence,.

Eu quero dividir ise pegar Thise a sentence.

Em Java, posso enviar uma sequência como delimitador, mas como faço isso C#?

Saobi
fonte

Respostas:

281

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

Exemplo dos 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
fonte
7
Na verdade, isso retorna: 'Th' '' 'uma sentença' com o exemplo dado na pergunta. Talvez seja isso que ele realmente quer, mas não é o que ele especificou.
21410 IRBMe
6
Este é apenas um exemplo ... O ponto é: Existe um String.Split que aceita as strings como delimitadores.
Bruno Conde
1
Sim, mas não faz o que a pergunta especifica. Você precisa usar algo um pouco mais inteligente para obter a saída especificada. Agora, se o que a pergunta especificada é realmente o que o solicitante deseja é uma pergunta diferente, mas a pergunta feita aqui não pode ser respondida trivialmente com apenas String.Split.
IRBMe 14/07/2009
3
Ainda não funciona direito. Se você incluir os espaços na palavra a serem divididos, eles não serão incluídos na saída. Se você examinar o exemplo dado na pergunta, perceberá que eles incluem os espaços. Dividir em "é" daria a você "Isto" e "uma frase", em vez de "Isto" e "uma frase". Observe os espaços sutis no final de "Isto" e no início de "uma frase". Novamente, essa resposta é provavelmente o que o questionador realmente deseja, mas não é o que ele pediu e, repito, String.Split não a resolverá trivialmente.
IRBMe 14/07/2009
2
@IRBMe você leu a pergunta? 'Eu quero dividir em "é". Então eu vou pegar "This" e "a sentença" '. Veja os espaços nos resultados ??? É exatamente o que Split faz.
11119 bruno conde
55

Você pode usar o método Regex.Split , algo como isto:

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

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

Edit : Isso satisfaz o exemplo que você deu. Observe que um String.Split comum também será dividido no " is " no final da palavra "This", por isso usei o método Regex e incluí os limites da palavra em torno do " is ". Observe, no entanto, que se você acabou de escrever este exemplo com erro, provavelmente String.Split será suficiente.

IRBMe
fonte
@ EDIT: Eu também não tinha certeza, mas você ainda pode usar a divisão de cordas normal e apenas preencher espaços de ambos os lados, se o objetivo dele é APENAS remover a palavra "is".
ahawker
1
Isso também não funciona (pelo menos não sem muito esforço), porque você não sabe se o espaço deve ficar à esquerda, à direita ou a ambos sem conhecer as posições da palavra que foi dividida na string .
IRBMe 14/07/2009
Parece muito complicado como String.Splity permite dividir em uma corda já ...
Ed S.
3
Já resolvi isso na minha edição da minha resposta, no comentário acima e em 3 comentários em outra resposta. String.Split não funciona para o exemplo fornecido na pergunta. Não vou me repetir mais uma vez explicando o porquê. Você pode ler todos os outros comentários, se desejar saber.
IRBMe 14/07/2009
Note que o método regex divisão não remove de pré delimitador e à direita delimitador sobre a variável ... :(
melaos
34

Com base nas respostas existentes neste post, isso simplifica a implementação :)

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
fonte
9
+1, isso grita por um método de extensão. Quase bobo que essa não seja uma das sobrecargas internas.
Todd Menier
9
@ToddMenier O que você quer dizer com "quase"?
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]);

EDIT: O "é" é preenchido em ambos os lados com espaços na matriz para preservar o fato de que você deseja apenas que a palavra "seja" removida da frase e a palavra "isto" permaneça intacta.

ahawker
fonte
8

...Em resumo:

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

Você pode usar String.Replace () para substituir a string de divisão desejada por um caractere que não ocorra na string e, em seguida, usar String.Split nesse caractere para dividir a string resultante para o mesmo efeito.

Paul Sonier
fonte
5

Ou use este código; (mesmo: new String [])

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

Aqui está uma função de extensão para fazer a divisão com um separador de string:

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

Exemplo 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
fonte
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
fonte
-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
fonte
19
Antes de publicar o código, você provavelmente deve tentar executá-lo através de um compilador primeiro, a menos que você indique que não o fez. Falta um ponto-e-vírgula na primeira linha e str1 e str2 não estão definidos. Sem mencionar que o código não funciona como o OP queria. Esse código o divide em "Th" e "é muito mais fácil".
mandreko