Domanda

Sto facendo una semplice stringa di input di analisi e io ho bisogno di una string tokenizer.Sono nuovo di C#, ma hanno programmato in Java, e sembra naturale che C# dovrebbe avere una string tokenizer.Non è vero?E dove si trova?Come faccio ad utilizzarlo?

È stato utile?

Soluzione

Si potrebbe utilizzare Stringa.Metodo 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 Sam Allen articolo su di dividere una stringa in c# (Prestazioni, Regex)

Altri suggerimenti

Voglio solo sottolineare la potenza del C#'s metodo Split e dare un confronto più dettagliato, in particolare da parte di qualcuno che viene da un Java sfondo.

Considerando che StringTokenizer in Java consente solo un singolo delimitatore, possiamo dividere su più delimitatori di rendere le espressioni regolari meno necessaria (anche se se uno ha bisogno di regex, l'uso di espressioni regolari, con tutti i mezzi!) Prendete per esempio questo:

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

Questo si divide in tre diverse delimitatori di restituire un array di gettoni.Possiamo anche rimuovere vuoto matrici con quello che potrebbe essere un secondo parametro per l'esempio precedente:

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

Una cosa di Java String tokenizer non hanno che credo che C# è carente (almeno Java 7 ha questa funzione) è la capacità di mantenere la parola(s) come token.C#'s Spalato e scartare i token.Questo potrebbe essere importante, per esempio, in alcune applicazioni NLP, ma per più applicazioni di uso generale, questo potrebbe non essere un problema.

Il metodo split di una stringa è ciò di cui hai bisogno.Infatti il tokenizer classe in Java è deprecato in favore di Java string metodo split.

Penso che il più vicino in .NET Framework è

string.Split()

Per il complesso di suddivisione, si potrebbe usare una regex creazione di un match di raccolta.

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

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

leggi questo, funzione split ha un overload che accetta un array consiste di separatori http://msdn.microsoft.com/en-us/library/system.stringsplitoptions.aspx

Simile a Java il metodo è:

Regex.Split(string, pattern);

dove

  • string - il testo è necessario dividere
  • pattern tipo di stringa del modello, ciò che è la suddivisione del testo

Se stai cercando di fare qualcosa come la divisione di argomenti della riga di comando in un .NET Console app, si sta andando ad avere problemi perché .NET è rotto o sta cercando di essere intelligente (il che significa che si e ' rotto).Ho bisogno di essere in grado di dividere gli argomenti per il carattere di spazio, conservando i valori letterali che sono state citate in modo che non vengono divisi a metà.Questo è il codice che ho scritto per fare il lavoro:

private static List<String> Tokenise(string value, char seperator)
{
    List<string> result = new List<string>();
    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 si potrebbe scrivere un metodo di estensione del Sistema.Stringa che fa la scissione di cui hai bisogno.È quindi possibile, quindi, utilizzare la sintassi:

string.SplitByMyTokens();

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top