string.split - par séparateur de caractères multiples

151

J'ai du mal à diviser une chaîne en c # avec un délimiteur de "] [".

Par exemple, la chaîne "abc] [rfd] [5] [,] [."

Devrait donner un tableau contenant;
abc
RFD
5
,
.

Mais je n'arrive pas à le faire fonctionner, même si j'essaie RegEx, je ne peux pas obtenir une division sur le délimiteur.

EDIT: Essentiellement, je voulais résoudre ce problème sans avoir besoin d'une expression régulière. La solution que j'accepte est;

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

Je suis heureux de pouvoir résoudre cette question partagée.


la source
Montrez-nous votre code qui échoue.
Konrad Rudolph
Veuillez également publier ce que vous en retirez, en plus de ce que vous avez publié, ce que vous voulez en retirer.
Lasse V. Karlsen
2
Copie

Réponses:

268

Pour afficher les deux string.Splitet l' Regexutilisation:

string input = "abc][rfd][5][,][.";
string[] parts1 = input.Split(new string[] { "][" }, StringSplitOptions.None);
string[] parts2 = Regex.Split(input, @"\]\[");
Marc Gravell
la source
5
Ou si votre code minimal anal comme moi: 'var parts1 = input.Split (new [] {"] ["}, StringSplitOptions.None);'
Paul Grimshaw
2
Quel est l'avantage de fournir le StringSplitOptions.Noneplus input.Split(new string[] { "][" })?
seebiscuit
1
Cela suppose qu'il y ait les deux personnages, non? Que faire si je veux diviser par "[" ou "]"? D'après mes tests jusqu'à présent, je suppose que c'est une histoire différente, non?
C4d
Merci, ça marche !!
Kumar
3
@ C4u String.Split("[]".ToCharArray())cela serait divisé par [et] séparément. Par exemple: Hello [World] Its [Me! serait: Bonjour le monde, c'est moi!
Ma Dude
36
string tests = "abc][rfd][5][,][.";
string[] reslts = tests.Split(new char[] { ']', '[' }, StringSplitOptions.RemoveEmptyEntries);
SwDevMan81
la source
8
Notez que cette approche suppose qu'il signifie diviser sur chaque] et [, même s'ils n'apparaissent pas dans la] [combinaison.
Lasse V. Karlsen
2
Cette surcharge de string.Split la traite comme 2 délimiteurs séparés - vous supprimez simplement le reste. Il y a une surcharge qui accepte une chaîne comme délimiteur (en fait, un tableau de chaînes) - vous n'avez donc pas à supprimer les valeurs vides (ce qui signifie aussi: vous pouvez trouver des valeurs vides lorsqu'elles existent valablement dans les données)
Marc Gravell
Votre] hypothèse est [correcte. Il n'a pas précisé, alors je lui ai donné quelque chose qui fonctionnerait pour son exemple. S'il ne veut pas les ignorer, cela fonctionnera. Mais sans plus d'informations, nous ne saurons jamais
SwDevMan81
C'est ce que je cherchais. Dans la question, c'était un problème simple, mais c'est une réponse avancée.
Bitterblue
C'était exactement ce que je cherchais. Mais la bonne réponse est aussi une nouvelle pour moi, je ne savais pas que vous pouviez vous séparer avec plus d'un personnage comme Marc l'a décrit. La syntaxe est assez nul.
Piotr Kula
13

Une autre option:

Remplacez le délimiteur de chaîne par un seul caractère, puis divisez-le sur ce caractère.

string input = "abc][rfd][5][,][.";
string[] parts1 = input.Replace("][","-").Split('-');
bar de mer2020
la source
1
C'est ce que je fais. Cela me donne une méthode générale normalisée qui fonctionne sur toutes les plates-formes sans avoir à me soucier des astuces spécifiques à la plate-forme.
David Betz le
5
Pas une bonne idée. Considérez: string input = "abc][rf-d][5". Le "-" dans "rf-d" sera intercepté comme délimiteur. Voir plutôt la réponse acceptée ci-dessus.
Gilad Barner le
Dans ce cas, remplacez et divisez par un caractère improbable tel que ~ ou `ou même un caractère non clavier tel que ¿ou ◙ etc.
seabass2020
1
J'aime la solution dans le cas où elle est claire, robuste et peut devenir normalisée. Mon utilisationDim Levels As New List(Of String)(newSelectedTask.Replace(LevelDelimter, Chr(13)).Split(Chr(13)))
Nasenbaer le
2
Regex.Split("abc][rfd][5][,][.", @"\]\]");
Christopher Klewes
la source