2013-03-27 13 views
21

Mi piacerebbe dividere una stringa utilizzando la funzione Split nella classe Regex. Il problema è che è rimuove i delimitatori e mi piacerebbe tenerli. Preferibilmente come elementi separati nel splitee.Come mantenere i delimitatori di Regex.Split?

Secondo lo other discussions che ho trovato, ci sono solo modi scomodi per raggiungere questo obiettivo.

Qualche suggerimento?

+6

stringa di input? la tua espressione regolare? uscita prevista? – I4V

+0

questo '.etc' non fornisce molte informazioni. riguardo al tuo algoritmo, ma posso provare almeno. Vedi la mia risposta – I4V

+6

Perché sei così aggressivo? Basta chiedere una domanda qood e ottenere una risposta migliore. Quello che vuoi fare può essere fatto anche senza 'Regex.Split'. Vedi [this] (http://www.perlmonks.org/?node=xy+problem) e leggi di nuovo la mia risposta. – I4V

risposta

59

appena messo il modello in un cattura-gruppo, e le partite apparirà anche nel risultato.

string[] result = Regex.Split("123.456.789", @"(\.)"); 

Risultato:

{ "123", ".", "456", ".", "789" } 

Questo funziona anche per molte altre lingue:

  • JavaScript: "123.456.789".split(/(\.)/g)
  • Python: re.split(r"(\.)", "123.456.789")
  • Perl: split(/(\.)/g, "123.456.789")

(Non Java però)

+0

Oh, questo era ancora meglio! Esempio divertente: si combina * qualsiasi * con un periodo che ** in realtà ** è un punto. +1 per una grande sintassi! Tuttavia, per qualche ragione non cattura l'ultimo elemento, quindi ottengo solo quello che hai detto ma ** tranne ** per la parte * 789 *. –

+0

Durante la lettura guarda avanti, ho letto che non è incluso in risultati come: Regex.Match ("rispondi 25 miglia in più", @ "\ d + \ s (? = Miles)"); // OUTPUT: 25 e un'altra affermazione afferma che per includere il separatore durante la suddivisione avvolgere il modello in positivo guardare avanti come: Regex.Split ("oneTwoThree", @ "(? = [A-Z])"); // OUTPUT one Two confuso –

+1

@sortednoun Il look-ahead corrisponde a zero caratteri, solo se il corpo corrisponde a quella posizione. Il corpo del look-ahead non fa parte della partita, quindi non c'è nulla in più da includere. Il testo corrispondente al corpo dovrebbe invece essere incluso nell'elemento successivo dell'array, quando si divide. '(? = ([A-Z]))' creerebbe entrambi un oggetto in più con la lettera E lo includerà nell'elemento successivo. –

0

Aggiungere di nuovo:

string[] Parts = "A,B,C,D,E".Split(','); 
    string[] Parts2 = new string[Parts.Length * 2 - 1]; 
    for (int i = 0; i < Parts.Length; i++) 
    { 
     Parts2[i * 2] = Parts[i]; 
     if (i < Parts.Length - 1) 
      Parts2[i * 2 + 1] = ","; 
    } 
+1

Ma ciò non funziona nel caso in cui la regex abbia più di una possibile corrispondenza. – AJMansfield

+1

Cosa fai se non sai quale delimitatore è stato usato? Puoi ripetere l'esempio a noi * classe Regex *? –

6

Usa Matches per trovare i separatori nella stringa, quindi ottenere i valori e i separatori.

Esempio:

string input = "asdf,asdf;asdf.asdf,asdf,asdf"; 

var values = new List<string>(); 
int pos = 0; 
foreach (Match m in Regex.Matches(input, "[,.;]")) { 
    values.Add(input.Substring(pos, m.Index - pos)); 
    values.Add(m.Value); 
    pos = m.Index + m.Length; 
} 
values.Add(input.Substring(pos)); 
+0

Oh, ho capito. Freddo. Comunque, vorrei che ci fosse un extra * Split * che prende un bool per decidere se mantenere i delimitatori. Credo che dovrò iniziare a programmare. Grazie! +1 per una risposta chiara. –

3

commento che ingresso è "abc1defg2hi3jkl" e regex è individuare cifre.

String input = "abc1defg2hi3jkl"; 
var parts = Regex.Matches(input, @"\d+|\D+") 
      .Cast<Match>() 
      .Select(m => m.Value) 
      .ToList(); 

parti sarebbero: abc1defg2hi3jkl

Problemi correlati