string.split: por delimitador de caracteres múltiples

151

Tengo problemas para dividir una cadena en C # con un delimitador de "] [".

Por ejemplo, la cadena "abc] [rfd] [5] [,] [."

Debe producir una matriz que contenga;
abc
RFD
5
,
.

Pero parece que no puedo hacer que funcione, incluso si intento RegEx no puedo obtener una división en el delimitador.

EDITAR: esencialmente quería resolver este problema sin la necesidad de una expresión regular. La solución que acepto es;

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

Me alegra poder resolver esta pregunta dividida.


fuente
Muéstranos tu código que falla.
Konrad Rudolph
Además, publique lo que obtiene de él, además de lo que ha publicado, lo que desea obtener de él.
Lasse V. Karlsen
2
Posible duplicado de dividir una cadena por otra cadena en C #
puzzlepiece87

Respuestas:

268

Para mostrar ambos string.Splity su Regexuso:

string input = "abc][rfd][5][,][.";
string[] parts1 = input.Split(new string[] { "][" }, StringSplitOptions.None);
string[] parts2 = Regex.Split(input, @"\]\[");
Marc Gravell
fuente
55
O si su código mínimo anal como yo: 'var parts1 = input.Split (new [] {"] ["}, StringSplitOptions.None);'
Paul Grimshaw
2
¿Cuál es el beneficio de proporcionar StringSplitOptions.Nonemás input.Split(new string[] { "][" })?
seebiscuit
1
Esto presupone que hay ambos personajes ¿verdad? ¿Qué sucede si quiero dividir entre "[" o "]"? Según mis pruebas hasta ahora, supongo que es una historia diferente, ¿verdad?
C4d
¡Gracias, funciona!
Kumar
3
@ C4u String.Split("[]".ToCharArray())esto se dividiría por ambos [y] por separado. Por ejemplo: Hola [Mundo] ¡Es [Yo! sería: ¡Hola, mundo, soy yo!
Ma Dude
36
string tests = "abc][rfd][5][,][.";
string[] reslts = tests.Split(new char[] { ']', '[' }, StringSplitOptions.RemoveEmptyEntries);
SwDevMan81
fuente
8
Tenga en cuenta que este enfoque supone que quiere dividir en cada] y [, incluso cuando no aparecen en la combinación] [.
Lasse V. Karlsen
2
Esa sobrecarga de string.Split lo trata como 2 delimitadores separados: simplemente está descartando el resto. Hay una sobrecarga que acepta una cadena como delimitador (en realidad, una matriz de cadenas), por lo que no tiene que eliminar los valores vacíos (lo que significa también: puede encontrar valores vacíos cuando existen válidamente en los datos)
Marc Gravell
Su] suposición es [correcta. No especificó, así que le di algo que funcionaría para su ejemplo. Si no quiere omitirlos, entonces funcionaría. Pero sin más información, nunca lo sabremos
SwDevMan81
Eso es lo que estaba buscando. En la pregunta era un problema simple pero esta es una respuesta avanzada.
Bitterblue
Eso era exactamente lo que estaba buscando. Pero la respuesta correcta también es una novedad para mí, no sabía que podría dividirse con más de un personaje como lo describió Marc. La sintaxis es bastante basura.
Piotr Kula
13

Otra opción:

Reemplace el delimitador de cadena con un solo carácter, luego divídalo en ese carácter.

string input = "abc][rfd][5][,][.";
string[] parts1 = input.Replace("][","-").Split('-');
lubina2020
fuente
1
Esto es lo que hago. Me da un método general normalizado que funciona en todas las plataformas sin tener que preocuparse por los trucos específicos de la plataforma.
David Betz
55
No es Buena idea. Considere lo siguiente: string input = "abc][rf-d][5". El "-" en "rf-d" se capturará como delimitador. Ver la respuesta aceptada arriba en su lugar.
Gilad Barner
En ese caso, reemplace y divida en un carácter poco probable como ~ o `o incluso un carácter que no sea de teclado como ¿o ◙ etc.
seabass2020
1
Me gusta la solución en caso de que sea clara, robusta y pueda normalizarse. Mi usoDim Levels As New List(Of String)(newSelectedTask.Replace(LevelDelimter, Chr(13)).Split(Chr(13)))
Nasenbaer
2
Regex.Split("abc][rfd][5][,][.", @"\]\]");
Christopher Klewes
fuente