iPhone iOS ¿cómo contar el número de casos insensibles a las mayúsculas y minúsculas de una palabra dentro de una cadena?

Estoy buscando una forma de search una cadena larga arbitraria (10000 caracteres) y encontrar el número de veces que se repite una palabra key específica en la cadena. ¿Cómo se puede hacer esto?

Tengo este método, que prácticamente count la cantidad de fragments que quedan después de que la cadena se divide entre palabras key, pero no es insensible a las mayúsculas y minúsculas.

-(void)countKeywords { NSArray* components = [self.salesCopy componentsSeparatedByString:@"search term"]; NSLog(@"search term number found: %i",components.count); } 

¿Cuál es una mejor manera de contar la cantidad de palabras key dentro de una cadena?

    Dividir la string, contar partes y tirarlas no es eficiente. Buscar subcadenas repetidamente sin crear nuevos objects definitivamente sería más eficiente. Dado que la cadena es relativamente larga, puede beneficiarse implementando un algorithm avanzado de búsqueda de cadenas, por ejemplo Knuth-Morris-Pratt , para disminuir significativamente el time de búsqueda.

    Aquí hay una implementación que debería ser más rápida que su código de split:

     NSString *str = @"Hello sun, hello bird, hello my lady! Hello breakfast, May I buy you again tomorrow?"; NSRange r = NSMakeRange(0, str.length); int count = 0; for (;;) { r = [str rangeOfString:@"hello" options:NSCaseInsensitiveSearch range:r]; if (r.location == NSNotFound) { break; } count++; r.location++; r.length = str.length - r.location; } NSLog(@"%d", count); 

    Simplemente cree copys de self.salesCopy y searchTerm, configure las copys en minúsculas a través de [NSString lowercaseString], luego realice su código y tendrá el recuento

     -(void)countKeywords { NSString *lowerCaseSalesCopy = [self.salesCopy lowercaseString]; NSString *lowerCaseSearchTerm = [searchTerm lowercaseString]; NSArray* components = [lowerCaseSalesCopy componentsSeparatedByString:lowerCaseSearchTerm]; NSLog(@"search term number found: %i",components.count); } 

    No estoy 100% seguro de que pueda ayudarlo, pero puede hacer parte del trabajo que necesita (si no todos):

     NSRange ran = [yourString rangeOfString:wordToLookFor options:NSCaseInsensitiveSearch]; 

    Y mira

     ran.length ran.location 

    ran.location le proporcionará la location dentro de la cadena de la primera aparición. Luego podría cortar la cadena después de esta ocurrencia y ejecutarla nuevamente hasta el final de la cadena.