Comment diviser une chaîne par un délimiteur à plusieurs caractères en C #?

232

Que faire si je souhaite fractionner une chaîne à l'aide d'un délimiteur qui est un mot?

Par exemple This is a sentence,.

Je veux me séparer iset obtenir Thiset a sentence.

Dans Java, je peux envoyer une chaîne comme délimiteur, mais comment puis-je y parvenir C#?

Saobi
la source

Réponses:

281

http://msdn.microsoft.com/en-us/library/system.string.split.aspx

Exemple de la documentation:

string source = "[stop]ONE[stop][stop]TWO[stop][stop][stop]THREE[stop][stop]";
string[] stringSeparators = new string[] {"[stop]"};
string[] result;

// ...
result = source.Split(stringSeparators, StringSplitOptions.None);

foreach (string s in result)
{
    Console.Write("'{0}' ", String.IsNullOrEmpty(s) ? "<>" : s);
}
bruno conde
la source
7
Cela renvoie en fait: 'Th' '' 'une phrase' avec l'exemple donné dans la question. C'est peut-être ce qu'il veut réellement, mais ce n'est pas ce qu'il a spécifié.
IRBMe
6
Ceci est juste un exemple ... Le point est: Il y a un String.Split qui prend les chaînes comme délimiteurs.
bruno conde
1
Oui, mais cela ne fait pas ce que la question spécifie. Vous devez utiliser quelque chose d'un peu plus intelligent pour obtenir la sortie spécifiée. Maintenant, si ce que la question spécifiée est réellement ce que le demandeur veut est une question différente, mais la question posée ici ne peut pas être répondue de manière triviale avec seulement String.Split.
IRBMe
3
Ça ne marche toujours pas tout à fait. Si vous incluez les espaces dans le mot à diviser, ils ne sont pas inclus dans la sortie. Si vous examinez l'exemple donné dans la question, vous remarquerez qu'ils incluent en fait les espaces. La division de «est» vous donnerait «ceci» et «une phrase» plutôt que «ceci» et «une phrase». Notez les espaces subtils à la fin de "Ceci" et au début de "une phrase". Encore une fois, cette réponse est probablement ce que le questionneur veut réellement, mais ce n'est pas ce qu'il a demandé et, je le répète, String.Split ne le résoudra pas trivialement.
IRBMe
2
@IRBMe avez-vous lu la question? 'Je veux partager sur "est". Je vais donc recevoir «ceci» et «une phrase» ». Voir les espaces dans les résultats ??? C'est exactement ce que fait Split.
bruno conde
55

Vous pouvez utiliser la méthode Regex.Split , quelque chose comme ceci:

Regex regex = new Regex(@"\bis\b");
string[] substrings = regex.Split("This is a sentence");

foreach (string match in substrings)
{
   Console.WriteLine("'{0}'", match);
}

Edit : Cela satisfait l'exemple que vous avez donné. Notez qu'un String.Split ordinaire se divisera également sur le " est " à la fin du mot "ceci", c'est pourquoi j'ai utilisé la méthode Regex et inclus les limites des mots autour du " est ". Notez cependant que si vous venez d'écrire cet exemple par erreur, alors String.Split suffira probablement.

IRBMe
la source
@ EDIT: Je n'étais pas sûr non plus, mais vous pouvez toujours utiliser le partage de chaîne normal et juste remplir les espaces de chaque côté si son objectif est de supprimer UNIQUEMENT le mot "est".
ahawker
1
Cela ne fonctionne pas non plus (du moins pas sans beaucoup plus d'efforts), car vous ne savez pas si l'espace doit aller à gauche, à droite ou les deux sans connaître les positions du mot qui a été divisé dans la chaîne .
IRBMe
Semble trop compliqué car String.Splity vous permet déjà de diviser sur une chaîne ...
Ed S.
3
Je l'ai déjà abordé dans ma modification de ma réponse, dans le commentaire ci-dessus et dans 3 commentaires sur une autre réponse. String.Split ne fonctionne pas pour l'exemple fourni dans la question. Je ne vais pas me répéter encore une fois en expliquant pourquoi. Vous pouvez lire tous les autres commentaires si vous le souhaitez.
IRBMe
notez que la méthode de regex split ne supprime pas le délimiteur pré et le délimiteur de fin sur la variable ... :(
melaos
34

Sur la base des réponses existantes sur ce post, cela simplifie la mise en œuvre :)

namespace System
{
    public static class BaseTypesExtensions
    {
        /// <summary>
        /// Just a simple wrapper to simplify the process of splitting a string using another string as a separator
        /// </summary>
        /// <param name="s"></param>
        /// <param name="pattern"></param>
        /// <returns></returns>
        public static string[] Split(this string s, string separator)
        {
            return s.Split(new string[] { separator }, StringSplitOptions.None);
        }


    }
}
eka808
la source
9
+1, cela crie pour une méthode d'extension. Presque stupide que ce ne soit pas l'une des surcharges intégrées.
Todd Menier
9
@ToddMenier Que voulez-vous dire "presque"?
mwardm
28
string s = "This is a sentence.";
string[] res = s.Split(new string[]{ " is " }, StringSplitOptions.None);

for(int i=0; i<res.length; i++)
    Console.Write(res[i]);

EDIT: le "est" est rempli des deux côtés avec des espaces dans le tableau afin de préserver le fait que vous voulez seulement que le mot "soit" supprimé de la phrase et que le mot "ceci" reste intact.

ahawker
la source
8

...En bref:

string[] arr = "This is a sentence".Split(new string[] { "is" }, StringSplitOptions.None);
ParPar
la source
5

Vous pouvez utiliser String.Replace () pour remplacer la chaîne de fractionnement souhaitée par un caractère qui n'apparaît pas dans la chaîne, puis utiliser String.Split sur ce caractère pour diviser la chaîne résultante pour le même effet.

Paul Sonier
la source
5

Ou utilisez ce code; (idem: nouvelle chaîne [])

.Split(new[] { "Test Test" }, StringSplitOptions.None)
Cagdas
la source
3

Voici une fonction d'extension pour effectuer le fractionnement avec un séparateur de chaînes:

public static string[] Split(this string value, string seperator)
{
    return value.Split(new string[] { seperator }, StringSplitOptions.None);
}

Exemple d'utilisation:

string mystring = "one[split on me]two[split on me]three[split on me]four";
var splitStrings = mystring.Split("[split on me]");
SteveD
la source
0
var dict = File.ReadLines("test.txt")
               .Where(line => !string.IsNullOrWhitespace(line))
               .Select(line => line.Split(new char[] { '=' }, 2, 0))
               .ToDictionary(parts => parts[0], parts => parts[1]);


or 

    enter code here

line="[email protected][email protected]";
string[] tokens = line.Split(new char[] { '=' }, 2, 0);

ans:
tokens[0]=to
token[1]=xxx@gmail.com=yyy@yahoo.co.in
Prabu
la source
-5
string strData = "This is much easier"
int intDelimiterIndx = strData.IndexOf("is");
int intDelimiterLength = "is".Length;
str1 = strData.Substring(0, intDelimiterIndx);
str2 = strData.Substring(intDelimiterIndx + intDelimiterLength, strData.Length - (intDelimiterIndx + intDelimiterLength));
Susmeet Khaire
la source
19
Avant de publier du code, vous devriez probablement essayer de l'exécuter d'abord via un compilateur, sauf si vous indiquez que vous ne l'avez pas fait. Il manque un point-virgule sur la première ligne et str1 et str2 ne sont pas définis. Sans oublier que le code ne fonctionne pas vraiment comme l'OP le voulait. Ce code le divise en "Th" et "est beaucoup plus facile".
mandreko