Sto eseguendo un semplice analisi dell'input di stringa e ho bisogno di un tokenizer di stringa. Sono nuovo di C # ma ho programmato Java e sembra naturale che C # abbia un tokenizer di stringa. Vero? Dov'è? Come lo uso?
È possibile utilizzare 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 ulteriori informazioni, vedere Articolo di Sam Allen sulla divisione delle stringhe in c # (Performance, Regex)
Voglio solo evidenziare la potenza del metodo Split di C # e dare un confronto più dettagliato, in particolare da parte di qualcuno che proviene da uno sfondo Java.
Mentre StringTokenizer in Java consente solo un singolo delimitatore, possiamo effettivamente dividere su più delimitatori rendendo meno necessarie le espressioni regolari (anche se se si ha bisogno di regex, usare regex con tutti i mezzi!) Prendiamo ad esempio questo:
str.Split(new char[] { ' ', '.', '?' })
Questo si divide su tre diversi delimitatori restituendo una matrice di token. Possiamo anche rimuovere matrici vuote con quello che sarebbe un secondo parametro per l'esempio sopra:
str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries)
Una cosa che il tokenizer String di Java ha che credo che manchi C # (almeno Java 7 ha questa funzione) è la capacità di mantenere i delimitatori come token. La divisione di C # eliminerà i token. Questo potrebbe essere importante per dire alcune applicazioni NLP, ma per applicazioni più generiche questo potrebbe non essere un problema.
Il metodo split di una stringa è ciò di cui hai bisogno. In effetti la classe tokenizer in Java è obsoleta a favore del metodo di suddivisione delle stringhe di Java.
Penso che il più vicino in .NET Framework sia
String.split ()
Per divisioni complesse è possibile utilizzare una regex creando una raccolta di corrispondenze.
_words = new List<string>(YourText.ToLower().Trim('\n', '\r').Split(' ').
Select(x => new string(x.Where(Char.IsLetter).ToArray())));
O
_words = new List<string>(YourText.Trim('\n', '\r').Split(' ').
Select(x => new string(x.Where(Char.IsLetterOrDigit).ToArray())));
usa Regex.Split(string,"#|#");
Il simile al metodo Java è:
Regex.Split(string, pattern);
dove
string
- il testo che devi dividerepattern
- modello di tipo stringa, ciò che sta dividendo il testoleggi questo, la funzione split ha un sovraccarico prende un array composto da separatori http://msdn.Microsoft.com/en-us/library/system.stringsplitoptions.aspx