Dividi una stringa con un'altra stringa in C #


682

Sto usando il Split()metodo per dividere le stringhe, ma questo sembra funzionare solo se stai dividendo una stringa per un carattere. C'è un modo per dividere un string, con un'altra stringa è la divisione per parametro?

Ho provato a convertire lo splitter in un array di caratteri, senza fortuna.

In altre parole, vorrei dividere string:

THExxQUICKxxBROWNxxFOX

da xxe restituisce un array con valori:

THE, QUICK, BROWN, FOX


2
Per preoccupazioni future: uno dei commenti di seguito mi ha interessato quindi ho deciso di aprire una discussione sull'ingegneria del software riguardante il modo non intuitivo (ma giusto) di farlo nella risposta accettata.
Scharette,

Risposte:


1239

Per dividere per una stringa dovrai usare il sovraccarico dell'array di stringhe .

string data = "THExxQUICKxxBROWNxxFOX";

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

4
In realtà ho finito per cambiare la mia risposta a questo per 2 motivi: # 1: per gestire le divisioni che voglio fare avrei bisogno di usare Regex.Escape, perché la mia stringa divisa conterrà spesso asterischi, ecc. # 2: Mentre questo programma Sto scrivendo non ha bisogno di una vera ottimizzazione, sembra che ci sia un ulteriore sovraccarico coinvolto nell'uso del metodo Regex Split.
Brandon,

7
@Peter: In quel post Jon lo suggerisce perché il poster non ha un delimitatore fisso; sta cercando di dividere le stringhe separate da "più di uno spazio" (che significa 2+). Per le stringhe delimitate da un pattern piuttosto che da un valore , RegEx è un'ottima opzione (bene, l' unica ). Per i delimitatori a valore fisso, introduce sovraccarico inutile. Prova a eseguire un test; con l'aumentare del numero di operazioni, RegEx finisce per prendere circa circa 10 volte il tempo corrispondente string.Split.
Adam Robinson,

9
Vengo da Python a C #. Python supporta la stringa divisa per un'altra stringa. E ho spesso bisogno di tornare a questa domanda per una risposta semplice string[] Split(string pattern), che è l'uso più naturale che mi viene in mente ma non c'è. Ho scritto C in precedenza, quindi sono abituato a creare array ma odio ancora vedere char[]spuntare in un codice C # perché improvvisamente trascina la mia attenzione dal livello del flusso al livello del byte. Qualcuno sa perché i ragazzi della libreria C # hanno progettato il metodo Split in questo modo? Se c'è una buona ragione, probabilmente posso provare ad apprezzarla nonostante l'inconveniente.
lungimiranza il

11
Questo frammento è in cima alla lista delle cose di cui mi vergognerei di mostrare agli sviluppatori non C #.
Traubenfuchs,

99
Perché diavolo non possiamo semplicemente fare data.Split("xx")?
Mc

122

C'è un sovraccarico di Split che prende le stringhe.

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

È possibile utilizzare una di queste StringSplitOptions

  • Nessuno : il valore restituito include elementi dell'array che contengono una stringa vuota
  • RemoveEmptyEntries : il valore restituito non include gli elementi dell'array che contengono una stringa vuota

Pertanto, se la stringa è "THExxQUICKxxxxBROWNxxFOX", StringSplitOptions.Noneverrà restituita una voce vuota nell'array per la parte "xxxx", mentre StringSplitOptions.RemoveEmptyEntriesnon lo sarà.


73
Regex.Split(string, "xx")

è il modo in cui lo faccio di solito.


Ovviamente avrai bisogno di:

using System.Text.RegularExpressions;

o :

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

ma poi ho ancora bisogno di quella libreria.


13
@Brandon: Mentre di solito sto mettendo in guardia dall'ottimizzazione prematura, dovresti essere consapevole del fatto che a RegEx.Splitè un po 'più costoso di un semplice a String.Splitcausa del sovraccarico di espressioni regolari.
Adam Robinson,

9
Se vuoi dividere per una stringa arbitraria, usa Regex.Escapeprima la stringa, questo eviterà qualsiasi meta-carattere regex.
Richard,

uno dei principali vantaggi che possono essere pagati per le spese generali è la capacità di fornire impostazioni di confronto delle stringhe
Timur Sadykov,

47

C'è un sovraccarico di String.Split per questo:

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

1
L'unica risposta che rimuove la dichiarazione di tipo array inutile.
wonea

25

In genere mi piace usare la mia estensione per questo:

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

Ciò comporterà tuttavia un'eccezione, se Microsoft decide di includere questo metodo di overload nelle versioni successive. È anche il probabile motivo per cui Microsoft non ha incluso questo metodo nel frattempo: almeno un'azienda per cui ho lavorato, ha utilizzato tale estensione in tutti i suoi progetti C #.

Potrebbe anche essere possibile definire in modo condizionale il metodo in fase di esecuzione se non esiste.


4
In alternativa, l'uso params string[] splittercome secondo parametro e il cambiamento new[] {splitter}di splitterper supportare più delimitatori.
Matthew Strawbridge,

10

Le risposte precedenti sono tutte corrette. Faccio un ulteriore passo avanti e faccio funzionare C # per me definendo un metodo di estensione su String:

public static class Extensions
{
    public static string[] Split(this string toSplit, string splitOn) {
        return toSplit.Split(new string[] { splitOn }, StringSplitOptions.None);
    }
}

In questo modo posso chiamarlo su qualsiasi stringa nel modo semplice che mi aspettavo ingenuamente la prima volta che ho provato a farlo:

"a big long string with stuff to split on".Split("g str");


7
string data = "THExxQUICKxxBROWNxxFOX";

return data.Replace("xx","|").Split('|');

Basta scegliere con cura il carattere di sostituzione (scegline uno che probabilmente non è già presente nella stringa)!


2
@MasoudHosseini: leggi la risposta completa; c'è già un disclaimer.
SNag

3
@kobe: Perché è un trucco terribile.
Overv

3
Funziona bene, ma è pericoloso per i metodi generici
Kaizonaro,

5
Pubblicare spiegazioni come "È un hack terribile" o "una cattiva risposta" non sono utili. È semplicemente un'opinione senza spiegazioni. Invece, affermando qualcosa del tipo "Non è necessario scansionare la stringa alla ricerca di sostituzioni e quindi scansionare i caratteri divisi poiché porta a prestazioni scadenti". sarebbe un modo migliore per spiegarti. Troppi programmatori agiscono in questo modo. :(
Matt Ruwe il

1
Che cosa succede se la stringa contiene |già il carattere, per questo motivo penso che sia pericoloso da usare.
amd

-1

Anche questo è facile:

string data = "THExxQUICKxxBROWNxxFOX";
string[] arr = data.Split("xx".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

1
Ma questo si dividerebbe anche "THExQUICK"dove non vogliamo che venga
diviso

Grazie Rafalon: sì, Greg è la risposta migliore: data.Split (nuova stringa [] {"xx"}, StringSplitOptions.RemoveEmptyEntries)
user890255

-4

Il modo più semplice è usare String.Replace:

string myString = "THExxQUICKxxBROWNxxFOX";
mystring = mystring.Replace("xx", ", ");

O più semplicemente:

string myString = "THExxQUICKxxBROWNxxFOX".Replace("xx", ", ");

3
Così com'è, questo non restituirà un array (come richiesto dalla domanda), solo una stringa con virgole dove si xxtrovavano.
Arj,

E non solo se la stringa contenesse virgole aggiuntive non saresti in grado di dividere correttamente le parole.
user3658298,
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.