¿Cuál es la mejor manera de tokenizar / dividir un NSString en Objective-C?
objective-c
cocoa
tokenize
Ned Batchelder
fuente
fuente
[anArray componentsJoinedByString:@":"];
.componentsSeparatedByCharactersInSet
. Ver la respuesta a continuación.Todos lo han mencionado,
componentsSeparatedByString:
pero también puede usarCFStringTokenizer
(recuerde que anNSString
yCFString
son intercambiables) que tokenizarán los idiomas naturales también (como el chino / japonés que no divide las palabras en espacios).fuente
enumerateLinesUsingBlock:
yenumerateSubstringsInRange:options:usingBlock:
, el último de los cuales es una versión basada en bloques de CFStringTokenizer. developer.apple.com/mac/library/documentation/Cocoa/Reference/… : developer.apple.com/mac/library/documentation/Cocoa/Reference/… :enumerate
métodos también están disponibles en iOS 4 y versiones posteriores.Si solo quiere dividir una cadena, use
-[NSString componentsSeparatedByString:]
. Para una tokenización más compleja, use la clase NSScanner.fuente
Si sus necesidades de tokenización son más complejas, consulte mi kit de herramientas de tokenización / análisis de Cacao String de código abierto: ParseKit:
http://parsekit.com
Para la división simple de cadenas usando un delimitador char (como ':'), ParseKit definitivamente sería excesivo. Pero, de nuevo, para necesidades de tokenización complejas, ParseKit es extremadamente potente / flexible.
Consulte también la documentación de tokenización de ParseKit .
fuente
Si desea tokenizar en varios caracteres, puede usar NSString
componentsSeparatedByCharactersInSet
. NSCharacterSet tiene algunos conjuntos prácticos prefabricados como elwhitespaceCharacterSet
y elillegalCharacterSet
. Y tiene inicializadores para rangos Unicode.También puede combinar conjuntos de caracteres y usarlos para tokenizar, de esta manera:
Tenga en cuenta que
componentsSeparatedByCharactersInSet
producirá cadenas en blanco si encuentra más de un miembro de charSet en una fila, por lo que es posible que desee probar longitudes menores a 1.fuente
Si está buscando convertir una cadena en términos de búsqueda al tiempo que conserva las "frases citadas", aquí hay una
NSString
categoría que respeta varios tipos de pares de citas:""
''
‘’
“”
Uso:
Código:
fuente
Si está buscando dividir las características lingüísticas de una cadena (palabras, párrafos, caracteres, oraciones y líneas), use la enumeración de cadenas:
Esta API funciona con otros idiomas donde los espacios no siempre son el delimitador (p. Ej., Japonés). También se usa
NSStringEnumerationByComposedCharacterSequences
la forma correcta de enumerar los caracteres, ya que muchos caracteres no occidentales tienen más de un byte de longitud.fuente
Tuve un caso en el que tuve que dividir la salida de la consola después de una consulta LDAP con ldapsearch. Primero configure y ejecute el NSTask (encontré una buena muestra de código aquí: ejecutar un comando de terminal desde una aplicación Cocoa ). Pero luego tuve que dividir y analizar la salida para extraer solo los nombres del servidor de impresión de la salida de consulta Ldap. Desafortunadamente, es bastante tedioso la manipulación de cadenas que no sería un problema en absoluto si tuviéramos que manipular cadenas / matrices C con operaciones simples de matriz C. Así que aquí está mi código usando objetos de cacao. Si tiene mejores sugerencias, hágamelo saber.
fuente
Me encontré con una instancia en la que no era suficiente separar la cadena por componente de muchas tareas, como
1) Categorizar el token en tipos
2) Agregar nuevos tokens
3) Separar la cadena entre cierres personalizados como todas las palabras entre "{" y "} "
Para tales requisitos, encontré Parse Kit un salvavidas.
Lo utilicé para analizar archivos .PGN (notación de juegos prtable) con éxito, es muy rápido y ligero.
fuente