Question

Je suis en train d'analyser une entrée de chaîne simple et j'ai besoin d'un tokenizer de chaîne. Je suis nouveau en C # mais j’ai programmé Java et il semble naturel que C # ait un tokenizer de chaîne. Le fait-il? Où est-ce? Comment l'utiliser?

Était-ce utile?

La solution

Vous pouvez utiliser Méthode 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
        }
    }
}

Pour plus d'informations, consultez l'article dans lequel Sam Allen décrit le fractionnement de chaînes en c # (Performance, Regex)

Autres conseils

Je veux seulement souligner la puissance de la méthode Split de C # et donner une comparaison plus détaillée, en particulier de la part d'une personne issue de l'arrière-plan Java.

Alors que StringTokenizer en Java n'autorise qu'un seul délimiteur, il est possible de scinder plusieurs délimiteurs, ce qui rend les expressions rationnelles moins nécessaires (bien que si vous avez besoin de regex, utilisez regex par tous les moyens!). Prenez par exemple ceci:

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

Cela se divise en trois délimiteurs différents renvoyant un tableau de jetons. Nous pouvons également supprimer les tableaux vides avec ce qui serait un deuxième paramètre pour l'exemple ci-dessus:

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

Une chose que le tokenizer String de Java possède et qui, à mon avis, fait défaut à C # (au moins, Java 7 possède cette fonctionnalité) est la possibilité de conserver le ou les délimiteurs en tant que jetons. La division C # supprimera les jetons. Cela pourrait être important dans certaines applications PNL, mais cela ne devrait pas poser de problème pour les applications plus générales.

La méthode de division d'une chaîne est ce dont vous avez besoin. En fait, la classe tokenizer en Java est déconseillée au profit de la méthode de scission de chaîne de Java.

Je pense que le plus proche du .NET Framework est

string.Split()

Pour les fractionnements complexes, vous pouvez utiliser une expression rationnelle créant une collection de correspondances.

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

Ou

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

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

lire ceci, la fonction split a une surcharge prend un tableau composé de séparateurs http://msdn.microsoft.com/en-us/library/ system.stringsplitoptions.aspx

La méthode similaire à celle de Java est la suivante:

Regex.Split(string, pattern);

  • chaîne - texte que vous devez fractionner
  • modèle - modèle de type chaîne, ce qui divise le texte

Si vous essayez de diviser des arguments de ligne de commande dans une application .NET Console, vous rencontrerez des problèmes, car .NET est cassé ou tente d'être intelligent (ce qui signifie qu'il est aussi bon que cassé. ). Je devais être capable de séparer les arguments par le caractère espace, en préservant les littéraux cités afin qu'ils ne soient pas divisés au milieu. Voici le code que j'ai écrit pour faire le travail:

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

Si vous utilisez C # 3.5, vous pouvez écrire une méthode d’extension dans System.String qui effectue la division dont vous avez besoin. Vous pouvez ensuite utiliser la syntaxe suivante:

string.SplitByMyTokens();

Plus d'infos et un exemple utile fourni par MS ici http: // msdn. microsoft.com/en-us/library/bb383977.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top