Quelle est la meilleure façon de tokeniser / diviser une NSString en Objective-C?
objective-c
cocoa
tokenize
Ned Batchelder
la source
la source
[anArray componentsJoinedByString:@":"];
.componentsSeparatedByCharactersInSet
. Voir la réponse ci-dessous.Tout le monde l'a mentionné,
componentsSeparatedByString:
mais vous pouvez également utiliserCFStringTokenizer
(rappelez-vous que unNSString
etCFString
sont interchangeables) qui symboliseront également les langues naturelles (comme le chinois / japonais qui ne divise pas les mots sur des espaces).la source
enumerateLinesUsingBlock:
etenumerateSubstringsInRange:options:usingBlock:
, cette dernière étant une version par blocs de CFStringTokenizer. developer.apple.com/mac/library/documentation/Cocoa/Reference/… : developer.apple.com/mac/library/documentation/Cocoa/Reference/… :enumerate
méthodes sont également disponibles dans iOS 4 et versions ultérieures.Si vous souhaitez simplement diviser une chaîne, utilisez
-[NSString componentsSeparatedByString:]
. Pour une tokenisation plus complexe, utilisez la classe NSScanner.la source
Si vos besoins de tokenisation sont plus complexes, consultez ma boîte à outils open source de tokenisation / analyse de chaîne Cocoa: ParseKit:
http://parsekit.com
Pour le fractionnement simple des chaînes en utilisant un caractère délimiteur (comme ':'), ParseKit serait certainement exagéré. Mais encore une fois, pour les besoins de tokenisation complexes, ParseKit est extrêmement puissant / flexible.
Consultez également la documentation relative à la tokenisation ParseKit .
la source
Si vous souhaitez tokeniser sur plusieurs caractères, vous pouvez utiliser NSString
componentsSeparatedByCharactersInSet
. NSCharacterSet propose des ensembles prédéfinis pratiques comme lewhitespaceCharacterSet
et leillegalCharacterSet
. Et il a des initialiseurs pour les plages Unicode.Vous pouvez également combiner des jeux de caractères et les utiliser pour tokeniser, comme ceci:
Sachez que
componentsSeparatedByCharactersInSet
cela produira des chaînes vides s'il rencontre plus d'un membre du charSet à la suite, vous pouvez donc tester les longueurs inférieures à 1.la source
Si vous souhaitez convertir une chaîne en termes de recherche tout en préservant les "phrases entre guillemets", voici une
NSString
catégorie qui respecte différents types de paires de citations:""
''
‘’
“”
Usage:
Code:
la source
Si vous cherchez à diviser les caractéristiques linguistiques d'une chaîne (mots, paragraphes, caractères, phrases et lignes), utilisez l'énumération de chaînes:
Cette API fonctionne avec d'autres langues où les espaces ne sont pas toujours le délimiteur (par exemple le japonais). L'utilisation
NSStringEnumerationByComposedCharacterSequences
est également la bonne façon d'énumérer des caractères, car de nombreux caractères non occidentaux ont plus d'un octet.la source
J'ai eu un cas où j'ai dû diviser la sortie de la console après une requête LDAP avec ldapsearch. Commencez par configurer et exécuter le NSTask (j'ai trouvé un bon exemple de code ici: exécutez une commande de terminal à partir d'une application Cocoa ). Mais ensuite, j'ai dû diviser et analyser la sortie afin d'extraire uniquement les noms de serveur d'impression de la sortie Ldap-query-output. Malheureusement, il s'agit d'une manipulation de chaînes assez fastidieuse qui ne poserait aucun problème si nous devions manipuler des chaînes C / tableaux avec de simples opérations C-array. Voici donc mon code utilisant des objets cacao. Si vous avez de meilleures suggestions, faites-le moi savoir.
la source
Je me suis retrouvé dans une instance où il ne suffisait pas de séparer simplement chaîne par composant de nombreuses tâches telles que
1) Catégoriser le jeton en types
2) Ajouter de nouveaux jetons
3) Séparer une chaîne entre des fermetures personnalisées comme tous les mots entre "{" et "} «
Pour toutes ces exigences, j'ai trouvé Parse Kit une bouée de sauvetage.
Je l'ai utilisé pour analyser avec succès les fichiers .PGN (notation de jeu prtable), c'est très rapide et léger.
la source