Frage

Ich mache einfach String-Input Parsing und ich bin in der Notwendigkeit einer Zeichenfolge tokenizer. Ich bin neu in C #, sondern haben Java programmiert, und es scheint nur natürlich, dass C # eine Zeichenfolge tokenizer haben sollte. Macht es? Wo ist es? Wie verwende ich es?

War es hilfreich?

Lösung

Sie könnten a href = verwenden < "http://msdn.microsoft.com/en-us/library/system.string.split.aspx" rel = "noreferrer" title = "String.Split Methode Msdn Referenz" > String.Split Methode .

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

Weitere Informationen finden Sie unter Sam Allen Artikel über Splitting Strings in c # (Performance, Regex)

Andere Tipps

Ich will nur die Kraft von C # 's Split-Methode markieren und einem detaillierteren Vergleich zu geben, vor allem von jemandem, der von einem Java-Hintergrund kommt.

Nehmen Sie

Während StringTokenizer in Java nur ein einziges Trennzeichen zulässt, können wir geteilt tatsächlich auf mehrere Trennzeichen machen regulären Ausdrücken weniger notwendig (obwohl, wenn man braucht, regex, regex Verwendung mit allen Mitteln!) Zum Beispiel so aus:

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

Diese teilt sich auf drei verschiedene Trennzeichen ein Array von Token zurück. Wir können auch leere Arrays mit entfernen, was ein zweiter Parameter für das obige Beispiel wäre:

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

Eine Sache Java String tokenizer hat, dass ich glaube, C # fehlt (mindestens Java 7 hat diese Funktion) ist die Fähigkeit, das Trennzeichen (s) als Zeichen zu halten. C # 's Split wird die Token verwerfen. Dies könnte in etwa einigen NLP-Anwendungen wichtig sein, aber für mehr allgemeine Anwendungen könnte dies kein Problem sein.

Die Split-Methode eines Strings ist das, was Sie brauchen. In der Tat in Java die tokenizer Klasse für Java-String Split-Methode veraltet.

Ich denke, die nächste in .NET Framework ist

string.Split()

Für komplexe Aufspaltung Sie einen regulären Ausdruck Erstellen einer Match-Sammlung nutzen könnten.

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

oder

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

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

liest diesen hat Split-Funktion eine Überlastung ein Array Takes seperators bestehen http://msdn.microsoft.com/en-us/library/ system.stringsplitoptions.aspx

Die ähnlich wie Java-Methode ist:

Regex.Split(string, pattern);

Dabei steht

  • string - der Text, den Sie aufteilen müssen
  • pattern - String-Typ-Muster, was den Text spaltet

Wenn Sie versuchen, so etwas wie Splitting Befehlszeilenargumente in einer .NET-Konsole app zu tun, Sie gehen Probleme zu haben, weil .NET entweder defekt ist oder versucht, schlau zu sein (das heißt, es ist so gut wie gebrochen ). Ich musste in der Lage sein, Argumente, die die Leerzeichen zu spalten, alle Literale bewahren, die zitiert wurden, so dass sie nicht in der Mitte geteilt bekommen. Dies ist der Code, den ich schrieb die Arbeit zu tun:

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

Wenn Sie mit C # 3.5 könnten Sie eine Erweiterungsmethode zu System.String schreiben, die die Spaltung macht Sie benötigen. Sie kann dann Syntax verwenden:

string.SplitByMyTokens();

Weitere Informationen und ein nützliches Beispiel von MS hier http: // msdn. microsoft.com/en-us/library/bb383977.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top