Me gustaría encontrar todas las apariciones de una subcadena en un NSString, e iterar una por una para hacer algunos cambios en ese NSString. ¿Cómo debería hacerlo?Iphone iterar sobre sucesiones de subcadenas de un NSString
Respuesta
¿Qué tal
// find first occurrence of search string in source string
NSRange range = [sourceString rangeOfString:@"searchString"];
while(range.location != NSNotFound)
{
// build a new string with your changed values
range = [sourceString rangeOfString:@"searchString" options:0 range:NSMakeRange(range.location + 1, [sourceString length] - range.location - 1)];
}
O simplemente
[sourceString stringByReplacingOccurrencesOfString:searchString withString:targetString];
si desea cambiar el searchString que en el mismo valor en todas partes de la cadena de origen.
También usando: NSArray * stringArray = [myString componentsSeparatedByString: @ "mySubString"]; –
Toqué la tecla incorrecta y mi respuesta se envió incompleta al principio :-) – TheEye
Por componentesSeparado ... elimina todas las apariciones de su cadena de búsqueda, no itera sobre ellas ... – TheEye
Me gustaría ir con algo como esto:
// Setup what you're searching and what you want to find
NSString *string = @"abcabcabcabc";
NSString *toFind = @"abc";
// Initialise the searching range to the whole string
NSRange searchRange = NSMakeRange(0, [string length]);
do {
// Search for next occurrence
NSRange range = [string rangeOfString:toFind options:0 range:searchRange];
if (range.location != NSNotFound) {
// If found, range contains the range of the current iteration
// NOW DO SOMETHING WITH THE STRING/RANGE
// Reset search range for next attempt to start after the current found range
searchRange.location = range.location + range.length;
searchRange.length = [string length] - searchRange.location;
} else {
// If we didn't find it, we have no more occurrences
break;
}
} while (1);
eso es complicado, hay una método para eso: '- (void) enumerateSubstringsInRange: (NSRange) opciones de rango: (NSStringEnumerationOptions) opta usarBlock: (void (^) (NSString * subserie, NSRange substringRange, NSRange enclosingRange, BOOL * stop)) block'. – calimarkus
Eso, es un muy buen punto. +1 en tu respuesta para eso. – mattjgalloway
Muy útil después de buscar mucho. Gracias. +1 –
Es posible que desee echar un vistazo a NSString class Documentation.
encontrar de caracteres y subcadenas
– rangeOfCharacterFromSet:
– rangeOfCharacterFromSet:options:
– rangeOfCharacterFromSet:options:range:
– rangeOfString:
– rangeOfString:options:
– rangeOfString:options:range:
– rangeOfString:options:range:locale:
– enumerateLinesUsingBlock:
– enumerateSubstringsInRange:options:usingBlock:
La división de cadenas
– componentsSeparatedByString:
– componentsSeparatedByCharactersInSet:
– stringByTrimmingCharactersInSet:
– substringFromIndex:
– substringWithRange:
– substringToIndex:
Si usted quiere hacer cambios, se puede utilizar:
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement
pero si eso no se ajusta a sus necesidades intente esto:
- (void)enumerateSubstringsInRange:(NSRange)range options:(NSStringEnumerationOptions)opts usingBlock:(void (^)(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop))block
Ver la documentación, según lo observado por HelmiB. – calimarkus
Ampliando @ theeye de answer, cociné esto:
@interface NSString (EnumerateOccurancesOfString)
- (void)enumerateOccurancesOfString:(NSString *)string usingBlock:(void (^)(NSRange substringRange, BOOL *stop))block;
@end
-
@implementation NSString (EnumerateOccurancesOfString)
- (void)enumerateOccurancesOfString:(NSString *)string usingBlock:(void (^)(NSRange range, BOOL * _Nonnull stop))block {
NSParameterAssert(block);
NSRange range = [self localizedStandardRangeOfString:string];
if (range.location == NSNotFound) return;
// Iterate all occurances of 'string'
while (range.location != NSNotFound)
{
BOOL stop = NO;
block(range, &stop);
if (stop) {
break;
}
// Continue the iteration
NSRange nextRange = NSMakeRange(range.location + 1, self.length - range.location - 1);
range = [self rangeOfString:string options:(NSStringCompareOptions)0 range:nextRange locale:[NSLocale currentLocale]]; // Will this sometimes conflict with the initial range obtained with -localizedStandardRangeOfString:?
}
}
@end
- 1. NSCopying y Sucesiones
- 2. Objective-C: ¿La mejor forma de extraer subcadenas de NSString?
- 3. La forma más eficiente de iterar sobre todos los caracteres en un NSString
- 4. perl: iterar sobre un typeglob
- 5. Python iterar sobre un diccionario
- 6. ¿Cómo iterar sobre un TreeMap?
- 7. Reemplazar ocurrencias de NSString - iPhone
- 8. iterar sobre una tupla
- 9. Iterar sobre enum?
- 10. iterar sobre la tupla
- 11. ¿Cómo iterar sobre PriorityQueue?
- 12. Macro para iterar sobre un GList
- 13. Google Filtrar: iterar sobre un diccionario JSON
- 14. ¿Iterar sobre un objeto para manubrios?
- 15. ¿Cómo iterar sobre un vector constante?
- 16. ¿Cómo iterar sobre un hash en Ruby?
- 17. Cómo iterar sobre un hash en mustache.js
- 18. cuándo liberar un iPhone NSString en
- 19. iPhone convertir NSString a un error NSURL
- 20. cómo iterar sobre los resultados de un selector de jquery
- 21. ¿Cómo puedo iterar sobre un vector de cadenas de C++?
- 22. iterar sobre objetos en CoffeeScript
- 23. jquery iterar sobre elementos secundarios
- 24. ¿Cómo iterar sobre una priority_queue?
- 25. ¿Puedo iterar sobre .NET4 MemoryCache?
- 26. ¿Cómo puedo iterar sobre ManyToManyField?
- 27. Iterar sobre el diccionario anidado
- 28. Iterar sobre las propiedades de JsonObject
- 29. iterar sobre el producto cartesiano de vectores
- 30. ¿Iterar sobre los diccionarios VBA?
¿Usted significa que si tuvieras '@" abcabcabcabcabcabc "' quieres iterar sobre todos los '@" abc "' s? – mattjgalloway
sí, eso es todo. –