782 votes

Diviser une chaîne par une autre chaîne en C#

J'ai utilisé le Split() pour diviser les chaînes de caractères, mais cela ne semble fonctionner que si vous divisez une chaîne par un caractère. Existe-t-il un moyen de diviser une string avec une autre chaîne de caractères comme paramètre de division par ?

J'ai essayé de convertir le séparateur en un tableau de caractères, sans succès.

En d'autres termes, je voudrais diviser les string :

THExxQUICKxxBROWNxxFOX

par xx et renvoie un tableau de valeurs :

LE, RENARD, BRUN, RAPIDE

4 votes

Pour des préoccupations futures : L'un des commentaires ci-dessous m'a intéressé, j'ai donc décidé d'ouvrir une discussion sur l'ingénierie logicielle concernant le non intuitif (mais correcte) de le faire dans la réponse acceptée.

1400voto

Adam Robinson Points 88472

Pour séparer par une chaîne de caractères, vous devrez utiliser la fonction surcharge du tableau de chaînes de caractères .

string data = "THExxQUICKxxBROWNxxFOX";

return data.Split(new string[] { "xx" }, StringSplitOptions.None);

4 votes

En fait, j'ai fini par modifier ma réponse à cette question pour deux raisons : #1 : Pour gérer les divisions que je veux faire, j'aurais besoin d'utiliser Regex.Escape, parce que ma chaîne de division contiendra souvent des astérisques, etc. #2 : Bien que le programme que j'écris n'ait pas besoin d'être optimisé, il semble que l'utilisation de la méthode Regex Split entraîne une surcharge supplémentaire.

1 votes

Pour ma défense, Jon Skeet a suggéré quelque part d'utiliser Regex lors de la division de chaînes de caractères avec des chaînes de caractères comme séparateur, et je dois admettre que lorsqu'il suggère quelque chose. j'ai tendance à croire que c'est rarement un mauvais conseil. ('Bien qu'il y ait des chances que vous vouliez séparer par chaîne plutôt que par caractère, auquel cas vous voudrez regarderRegex.Split')

7 votes

@Peter : Dans ce post, Jon le suggère parce que l'affiche n'a pas de délimiteur fixe ; il cherche à séparer des chaînes de caractères séparées par "plus d'un espace" (c'est-à-dire 2+). Pour les chaînes de caractères délimitées par un motif plutôt qu'un valeur RegEx est un excellent outil (enfin, l'outil d'aide à la décision). uniquement ). Pour les délimiteurs à valeur fixe, elle introduit une surcharge inutile. Essayez de faire un test ; au fur et à mesure que le nombre d'opérations augmente, RegEx finit par prendre environ ~10x plus de temps que l'option correspondante string.Split .

133voto

Greg Points 11257

Il existe un surcharge de Split qui prend des chaînes de caractères.

"THExxQUICKxxBROWNxxFOX".Split(new [] { "xx" }, StringSplitOptions.None);

Vous pouvez utiliser l'une de ces options StringSplitOptions

  • Aucun - La valeur de retour comprend les éléments du tableau qui contiennent une chaîne vide
  • RemoveEmptyEntries - La valeur de retour ne comprend pas les éléments du tableau qui contiennent une chaîne vide

Donc si la chaîne est "THExxQUICKxxxxBROWNxxFOX", StringSplitOptions.None retournera une entrée vide dans le tableau pour la partie "xxxx" alors que StringSplitOptions.RemoveEmptyEntries ne le fera pas.

0 votes

Il ne "prend" pas vraiment les chaînes de caractères. Il s'attend à un tableau de caractères, vous avez simplement utilisé le constructeur littéral pour cela.

82voto

Peter Points 14647
Regex.Split(string, "xx")

c'est la façon dont je le fais habituellement.


Bien sûr, vous en aurez besoin :

using System.Text.RegularExpressions;

ou :

System.Text.RegularExpressions.Regex.Split(string, "xx")

mais là encore, j'ai besoin de cette bibliothèque tout le temps.

14 votes

@Brandon : Bien que je mette habituellement en garde contre une optimisation prématurée, vous devez savoir qu'une RegEx.Split est un peu plus coûteux qu'une simple String.Split à cause de la surcharge des expressions régulières.

11 votes

Si vous voulez diviser par une chaîne arbitraire, utilisez Regex.Escape sur la chaîne de caractères en premier, ce qui permet d'échapper aux métacaractères de la regex.

0 votes

L'un des avantages clés qui peut payer les frais généraux est la possibilité de fournir un paramètre de comparaison de chaînes de caractères.

48voto

bruno conde Points 28120

Il y a une surcharge de String.Split pour ça :

"THExxQUICKxxBROWNxxFOX".Split(new [] {"xx"}, StringSplitOptions.None);

1 votes

La seule réponse qui supprime la déclaration inutile du type de tableau.

29voto

Lo Sauer Points 5469

Je préfère généralement utiliser ma propre extension pour cela :

string data = "THExxQUICKxxBROWNxxFOX";
var dataspt = data.Split("xx");
//>THE  QUICK  BROWN  FOX 

//the extension class must be declared as static
public static class StringExtension
{   
    public static string[] Split(this string str, string splitter)
    {
        return str.Split(new[] { splitter }, StringSplitOptions.None);
    }
}

Cela entraînera toutefois une exception, si Microsoft décide d'inclure cette méthode de surcharge dans les versions ultérieures. C'est aussi la raison probable pour laquelle Microsoft n'a pas inclus cette méthode dans l'intervalle : Au moins une société pour laquelle j'ai travaillé, utilisait une telle extension dans tous ses projets C#.

Il peut également être possible de définir conditionnellement la méthode au moment de l'exécution si elle n'existe pas.

4 votes

Vous pouvez également utiliser params string[] splitter comme deuxième paramètre et modifiez new[] {splitter} a splitter pour prendre en charge plusieurs délimiteurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X