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.

c#  split 

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

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, @"\]\[");

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);

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('-');

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.