Come divido una stringa per un delimitatore multi-carattere in C #?


232

E se volessi dividere una stringa usando un delimitatore che è una parola?

Ad esempio This is a sentence,.

Voglio dividere ise ottenere Thise a sentence.

In Java, posso inviare una stringa come delimitatore, ma come posso farlo in C#?

Risposte:


281

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

Esempio dai documenti:

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

7
In realtà questo restituisce: 'Th' '' 'una frase' con l'esempio fornito nella domanda. Forse è quello che vuole veramente, ma non è quello che ha specificato.
IRBMe,

6
Questo è solo un esempio ... Il punto è: c'è un String.Split che accetta le stringhe come delimitatori.
bruno conde,

1
Sì, ma non fa ciò che la domanda specifica. Devi usare qualcosa di un po 'più intelligente per ottenere l'output specificato. Ora, se ciò che la domanda specificata è in realtà ciò che chi desidera è una domanda diversa, ma alla domanda posta qui non è possibile rispondere banalmente con solo String.Split.
IRBMe,

3
Non funziona ancora del tutto. Se includi gli spazi nella parola da dividere, questi non sono inclusi nell'output. Se si esamina l'esempio fornito nella domanda, si noterà che in realtà includono gli spazi. Dividere su "è" ti darebbe "Questo" e "una frase" anziché "Questo" e "una frase". Nota gli spazi sottili alla fine di "Questo" e l'inizio di "una frase". Ancora una volta, questa risposta è probabilmente ciò che l'interrogante vuole realmente, ma non è quello che ha chiesto e, ripeto, String.Split non lo risolverà banalmente.
IRBMe,

2
@IRBMe hai letto la domanda? 'Voglio dividere su "è". Quindi otterrò "Questo" e "una frase" '. Vedi gli spazi nei risultati ??? Questo è esattamente ciò che fa Split.
bruno conde,

55

È possibile utilizzare il metodo Regex.Split , in questo modo:

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

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

Modifica : questo soddisfa l'esempio che hai dato. Nota che un normale String.Split si dividerà anche su " is " alla fine della parola "This", quindi perché ho usato il metodo Regex e ho incluso i limiti di parola attorno a " is ". Nota, tuttavia, che se hai appena scritto questo esempio per errore, probabilmente String.Split sarà sufficiente.


@ EDIT: non ne ero nemmeno sicuro, ma puoi comunque usare la normale divisione delle stringhe e riempire solo gli spazi su entrambi i lati se il suo obiettivo è SOLO rimuovere la parola "is".
Ahawker,

1
Non funziona neanche (almeno non senza molto sforzo), perché non sai se lo spazio dovrebbe andare a sinistra, a destra o entrambi senza conoscere le posizioni della parola che è stata divisa nella stringa .
IRBMe,

Sembra troppo complicato come String.Splity ti permette di dividere su una stringa già ...
Ed S.

3
Ho già indirizzato questo nella mia modifica alla mia risposta, nel commento sopra e in 3 commenti su un'altra risposta. String.Split non funziona per l'esempio fornito nella domanda. Non mi ripeterò ancora una volta spiegando il perché. Puoi leggere tutti gli altri commenti se vuoi sapere.
IRBMe,

si noti che il metodo regex split non rimuove il delimitatore pre e il delimitatore finale sulla variabile ... :(
melaos,

34

Sulla base delle risposte esistenti su questo post, questo semplifica l'implementazione :)

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


    }
}

9
+1, questo grida per un metodo di estensione. Quasi sciocco che questo non è uno dei sovraccarichi incorporati.
Todd Menier,

9
@ToddMenier Cosa intendi con "quasi"?
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: "is" è riempito su entrambi i lati con spazi nell'array al fine di preservare il fatto che si desidera solo che la parola "sia" rimossa dalla frase e la parola "this" rimanga intatta.


8

...In breve:

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

5

È possibile utilizzare String.Replace () per sostituire la stringa divisa desiderata con un carattere che non si trova nella stringa e quindi utilizzare String.Split su quel carattere per dividere la stringa risultante per lo stesso effetto.


5

Oppure usa questo codice; (stesso: nuova stringa [])

.Split(new[] { "Test Test" }, StringSplitOptions.None)

3

Ecco una funzione di estensione per eseguire la divisione con un separatore di stringhe:

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

Esempio di utilizzo:

string mystring = "one[split on me]two[split on me]three[split on me]four";
var splitStrings = mystring.Split("[split on me]");

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="to=xxx@gmail.com=yyy@yahoo.co.in";
string[] tokens = line.Split(new char[] { '=' }, 2, 0);

ans:
tokens[0]=to
token[1]=xxx@gmail.com=yyy@yahoo.co.in

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

19
Prima di pubblicare il codice, dovresti probabilmente provare a eseguirlo prima attraverso un compilatore, a meno che non indichi di non averlo fatto. Manca un punto e virgola nella prima riga e str1 e str2 non sono definiti. Per non parlare del fatto che il codice in realtà non funziona come voleva l'OP. Questo codice lo divide in "Th" ed "è molto più semplice".
Mandreko,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.