C # ha un token stringa come Java?

Sto facendo un semplice parsing di input per le stringhe e ho bisogno di un tokenizer per le stringhe. Sono nuovo di C # ma ho programmato Java, e sembra naturale che C # abbia un tokenizzatore di stringhe. Lo fa? Dov’è? Come lo uso?

Potresti usare il metodo String.Split .

class ExampleClass { public ExampleClass() { string exampleString = "there is a cat"; // Split string on spaces. This will separate all the words in a string string[] words = exampleString.Split(' '); foreach (string word in words) { Console.WriteLine(word); // there // is // a // cat } } } 

Per maggiori informazioni vedi l’articolo di Sam Allen sulla divisione delle stringhe in c # (Performance, Regex)

Il metodo split di una stringa è ciò di cui hai bisogno. Infatti la class tokenizer in Java è deprecata a favore del metodo split split di Java.

Voglio solo evidenziare la potenza del metodo Split di C # e dare un confronto più dettagliato, in particolare da qualcuno che proviene da uno sfondo Java.

Considerando che StringTokenizer in Java consente solo un singolo delimitatore, in realtà possiamo dividere su più delimitatori rendendo le espressioni regolari meno necessarie (anche se se si ha bisogno di espressioni regolari, si usi la regex con tutti i mezzi!) Prendiamo ad esempio questo:

 str.Split(new char[] { ' ', '.', '?' }) 

Questo si divide su tre diversi delimitatori che restituiscono una serie di token. Possiamo anche rimuovere gli array vuoti con quello che sarebbe un secondo parametro per l’esempio precedente:

 str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries) 

Una cosa è che il tokenizzatore di stringa di Java ha che io credo che C # sia mancante (almeno Java 7 ha questa caratteristica) è la capacità di mantenere i delimitatori come token. La divisione di C # scarterà i gettoni. Questo potrebbe essere importante per alcune applicazioni di PNL, ma per applicazioni più generali questo potrebbe non essere un problema.

Penso che sia il più vicino in .NET Framework

 string.split ()
 _words = new List(YourText.ToLower().Trim('\n', '\r').Split(' '). Select(x => new string(x.Where(Char.IsLetter).ToArray()))); 

O

 _words = new List(YourText.Trim('\n', '\r').Split(' '). Select(x => new string(x.Where(Char.IsLetterOrDigit).ToArray()))); 

Per una suddivisione complessa è ansible utilizzare una regex che crea una raccolta di corrispondenze.

usa Regex.Split(string,"#|#");

leggi questo, la funzione split ha un sovraccarico che richiede un array composto da seperators http://msdn.microsoft.com/en-us/library/system.stringsplitoptions.aspx

Il simile al metodo di Java è:

 Regex.Split(string, pattern); 

dove

  • string – il testo che devi dividere
  • pattern – tipo di stringa, che cosa divide il testo

Se stai provando a fare qualcosa come suddividere gli argomenti della riga di comando in un’app Console .NET, avrai dei problemi perché .NET è rotto o sta cercando di essere intelligente (il che significa che è buono quanto rotto). Dovevo essere in grado di dividere gli argomenti in base al carattere dello spazio, preservando tutti i letterali citati in modo che non si dividessero nel mezzo. Questo è il codice che ho scritto per fare il lavoro:

 private static List Tokenise(string value, char seperator) { List result = new List(); value = value.Replace(" ", " ").Replace(" ", " ").Trim(); StringBuilder sb = new StringBuilder(); bool insideQuote = false; foreach(char c in value.ToCharArray()) { if(c == '"') { insideQuote = !insideQuote; } if((c == seperator) && !insideQuote) { if (sb.ToString().Trim().Length > 0) { result.Add(sb.ToString().Trim()); sb.Clear(); } } else { sb.Append(c); } } if (sb.ToString().Trim().Length > 0) { result.Add(sb.ToString().Trim()); } return result; } 

Se si utilizza C # 3.5, è ansible scrivere un metodo di estensione su System.String che esegue la suddivisione necessaria. Quindi puoi usare la syntax:

 string.SplitByMyTokens(); 

Maggiori informazioni e un utile esempio da MS qui http://msdn.microsoft.com/en-us/library/bb383977.aspx