string.split - por delimitador de vários caracteres


151

Estou tendo problemas para dividir uma string em c # com um delimitador de "] [".

Por exemplo, a cadeia "abc] [rfd] [5] [,] [."

Deve produzir uma matriz contendo;
ABC
RFD
5
,
.

Mas não consigo fazê-lo funcionar, mesmo se eu tentar o RegEx, não consigo obter uma divisão no delimitador.

Edição: essencialmente, eu queria resolver esse problema sem a necessidade de uma expressão regular. A solução que eu aceito é;

string Delimiter = "][";  
var Result[] = StringToSplit.Split(new[] { Delimiter }, StringSplitOptions.None);

Fico feliz em poder resolver esta questão dividida.

c#  split 

Mostre-nos o seu código que falha.
— 218 Konrad Rudolph

Além disso, poste o que você obtém dele, além do que você postou, o que você quer tirar dele.
— Lasse V. Karlsen

Respostas:


268

Para mostrar ambos string.Splite Regexuso:

string input = "abc][rfd][5][,][.";
string[] parts1 = input.Split(new string[] { "][" }, StringSplitOptions.None);
string[] parts2 = Regex.Split(input, @"\]\[");

5
Ou se o seu código mínimo anal como eu: 'var parts1 = input.Split (new [] {"] ["}, StringSplitOptions.None);'
— Paul Grimshaw

2
Qual é o benefício de fornecer o StringSplitOptions.Noneexcesso input.Split(new string[] { "][" })?
— seebiscuit

1
Isso pressupõe que existem dois caracteres, certo? E se eu quiser dividir por "[" ou "]"? Dos meus testes até agora, acho que é uma história diferente, certo?
— C4d

Obrigado, funciona !!
— Kumar

3
@ C4u String.Split("[]".ToCharArray())isso dividiria por [e] separadamente. Por exemplo: Olá [Mundo] É [Eu! seria: Olá, mundo, sou eu!
— Ma Dude

36
string tests = "abc][rfd][5][,][.";
string[] reslts = tests.Split(new char[] { ']', '[' }, StringSplitOptions.RemoveEmptyEntries);

8
Observe que essa abordagem pressupõe que ele pretende dividir cada] e [, mesmo quando eles não aparecem na combinação] [.
— Lasse V. Karlsen

2
Essa sobrecarga de string.Split está tratando-o como 2 delimitadores separados - simplesmente você está descartando o resto. Há uma sobrecarga que aceita uma string como delimitador (na verdade, uma matriz de strings) - para que você não precise remover os valores vazios (ou seja: você pode encontrar valores vazios quando eles existirem nos dados)
— Marc Gravell

Sua] suposição é [correta. Ele não especificou, então eu lhe dei algo que funcionaria para o seu exemplo. Se ele não quiser pular eles, então funcionaria. Mas sem mais informações, nós nunca saberemos
— SwDevMan81

Era isso que eu estava procurando. Na pergunta, era um problema simples, mas esta é uma resposta avançada.
— Bitterblue

Era exatamente o que eu estava procurando. Mas a resposta correta também é novidade para mim, não sabia que você poderia dividir com mais de um personagem, como Marc descreveu. A sintaxe é um lixo.
— Piotr Kula

13

Outra opção:

Substitua o delimitador de sequência por um único caractere e divida nesse caractere.

string input = "abc][rfd][5][,][.";
string[] parts1 = input.Replace("][","-").Split('-');

1
Isto é o que eu faço. Isso me fornece um método geral e normalizado que funciona em todas as plataformas sem precisar se preocupar com truques específicos da plataforma.
— David Betz 02/01

5
Não é uma boa ideia. Considere o seguinte: string input = "abc][rf-d][5". O "-" em "rf-d" será capturado como um delimitador. Veja a resposta aceita acima.
— Gilad Barner

Nesse caso, substitua-o por e dividir um caráter improvável, como ~ ou 'ou até mesmo um personagem sem teclado, como ¿ou ◙ etc.
— seabass2020

1
Eu gosto da solução caso seja clara, robusta e possa se normalizar. Meu usoDim Levels As New List(Of String)(newSelectedTask.Replace(LevelDelimter, Chr(13)).Split(Chr(13)))
— Nasenbaer 26/06

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.