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.


fonte
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
2
Possível duplicado de dividir uma string por outra string em C #
puzzlepiece87

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, @"\]\[");
Marc Gravell
fonte
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);
SwDevMan81
fonte
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('-');
seabass2020
fonte
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
2
Regex.Split("abc][rfd][5][,][.", @"\]\]");
Christopher Klewes
fonte