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.