web-dev-qa-db-fra.com

C # a-t-il un Tokenizer de chaîne comme Java?

Je fais une analyse de saisie 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 est-ce que je l'utilise?

65
andrewrk

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, voir article de Sam Allen sur le fractionnement de chaînes en c # (Performance, Regex)

115
Davy Landman

Je veux juste souligner la puissance de la méthode Split de C # et donner une comparaison plus détaillée, en particulier de quelqu'un qui vient d'un arrière-plan Java.

Alors que StringTokenizer dans Java n'autorise qu'un seul délimiteur, nous pouvons en fait diviser sur plusieurs délimiteurs, rendant les expressions régulières moins nécessaires (bien que si l'on a 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 des 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 de chaîne de Java a que je pense que C # fait défaut (au moins Java 7 a cette fonctionnalité) est la capacité de garder le ou les délimiteurs en tant que jetons. Le partage de C # rejettera les jetons Cela peut être important, par exemple, pour certaines applications NLP, mais pour des applications plus générales, cela peut ne pas être un problème.

21
demongolem

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

18
Tim Jarvis

Je pense que le plus proche dans le .NET Framework est

 string.Split () 
3
Steve Morgan

Pour un fractionnement complexe, vous pouvez utiliser une expression régulière créant une collection de correspondances.

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

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

1
adr

La méthode similaire à Java est la suivante:

Regex.Split(string, pattern);

  • string - le texte à diviser
  • pattern - modèle de type chaîne, qu'est-ce qui divise le texte
0
neronovs

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

0
Musa