2010-07-20 10 views
122

¿Cómo puedo detectar si una cadena contiene una palabra determinada? Por ejemplo, tengo una cuerda por debajo del cual se lee:¿Detecta si un NSString contiene ...?

@"Here is my string." 

Me gustaría saber si puedo detectar una palabra de la cadena, tales como "es" por ejemplo.

+0

posible duplicado de [Searchi ng NSString Cocoa?] (http://stackoverflow.com/questions/2609456/searching-nsstring-cocoa) – kennytm

+26

¿Puedes aceptar una respuesta? –

+0

Una solución barata y sucia, si se supone que la cadena no contiene signos de puntuación, consiste en concatenar espacios en blanco en el anverso y reverso de AMBAS cuerdas, luego haga 'rangeOfString'. –

Respuesta

190

Así es como yo lo haría:

NSString *someString = @"Here is my string"; 
NSRange isRange = [someString rangeOfString:@"is " options:NSCaseInsensitiveSearch]; 
if(isRange.location == 0) { 
    //found it... 
} else { 
    NSRange isSpacedRange = [someString rangeOfString:@" is " options:NSCaseInsensitiveSearch]; 
    if(isSpacedRange.location != NSNotFound) { 
     //found it... 
    } 
} 

Usted puede agregar fácilmente esto como una categoría en NSString:

@interface NSString (JRStringAdditions) 

- (BOOL)containsString:(NSString *)string; 
- (BOOL)containsString:(NSString *)string 
       options:(NSStringCompareOptions)options; 

@end 

@implementation NSString (JRStringAdditions) 

- (BOOL)containsString:(NSString *)string 
       options:(NSStringCompareOptions)options { 
    NSRange rng = [self rangeOfString:string options:options]; 
    return rng.location != NSNotFound; 
} 

- (BOOL)containsString:(NSString *)string { 
    return [self containsString:string options:0]; 
} 

@end 
+0

Aquí hay una categoría útil para NSString http://goo.gl/SNkk0 –

+2

En realidad, puede simplemente agregar espacio al principio y al final de la cadena y "es" coincidirá con que la cadena comienza con "es" –

+0

Me sorprende que estos no son parte de la clase estándar. Gracias, @Jacob! –

0

Una solución completa en primer lugar explorar en busca de la cadena (sin espacios añadidos) , luego verifique si el carácter inmediatamente anterior está en blanco o al principio de la línea. Del mismo modo, compruebe si el siguiente personaje está en blanco o al final de la línea. Si ambas pruebas pasan, entonces tienes una coincidencia. Dependiendo de sus necesidades, también puede verificar ,, ., (), etc.

Un enfoque alternativo, por supuesto, es analizar la cadena en palabras y verificar cada palabra individualmente.

2

Recomiendo usar NSLinguisticTagger. Podemos utilizarlo para buscar Here is my string. His isn't a mississippi isthmus. It is?

NSLinguisticTagger *linguisticTagger = [[NSLinguisticTagger alloc] initWithTagSchemes:@[ 
             NSLinguisticTagSchemeTokenType, 
             ] 
                       options: 
             NSLinguisticTaggerOmitPunctuation | 
             NSLinguisticTaggerOmitWhitespace | 
             NSLinguisticTaggerOmitOther ]; 
[linguisticTagger setString:@"Here is my string. His isn't a mississippi isthmus. It is?"]; 
[linguisticTagger enumerateTagsInRange:NSMakeRange(0, 
                [[linguisticTagger string] length]) 
           scheme:NSLinguisticTagSchemeTokenType 
           options: 
NSLinguisticTaggerOmitPunctuation | 
NSLinguisticTaggerOmitWhitespace | 
NSLinguisticTaggerOmitOther | 
NSLinguisticTaggerJoinNames 
          usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) { 
           NSLog(@"tag: %@, tokenRange: %@, sentenceRange: %@, token: %@", 
             tag, 
             NSStringFromRange(tokenRange), 
             NSStringFromRange(sentenceRange), 
             [[linguisticTagger string] substringWithRange:tokenRange]); 
          }]; 

Este salidas:

tag: Word, tokenRange: {0, 4}, sentenceRange: {0, 19}, token: Here 
tag: Word, tokenRange: {5, 2}, sentenceRange: {0, 19}, token: is 
tag: Word, tokenRange: {8, 2}, sentenceRange: {0, 19}, token: my 
tag: Word, tokenRange: {11, 6}, sentenceRange: {0, 19}, token: string 
tag: Word, tokenRange: {19, 3}, sentenceRange: {19, 33}, token: His 
tag: Word, tokenRange: {23, 2}, sentenceRange: {19, 33}, token: is 
tag: Word, tokenRange: {25, 3}, sentenceRange: {19, 33}, token: n't 
tag: Word, tokenRange: {29, 1}, sentenceRange: {19, 33}, token: a 
tag: Word, tokenRange: {31, 11}, sentenceRange: {19, 33}, token: mississippi 
tag: Word, tokenRange: {43, 7}, sentenceRange: {19, 33}, token: isthmus 
tag: Word, tokenRange: {52, 2}, sentenceRange: {52, 6}, token: It 
tag: Word, tokenRange: {55, 2}, sentenceRange: {52, 6}, token: is 

Ignora Hismississippi y isthmus e incluso identifica is interior de isn't.

88

Usa el siguiente código para escanear la palabra en una oración.

NSString *sentence = @"The quick brown fox"; 
NSString *word = @"quack"; 
if ([sentence rangeOfString:word].location != NSNotFound) { 
    NSLog(@"Yes it does contain that word"); 
} 
+0

¿cómo puedo obtener las ubicaciones cuando uso este método en una matriz? – judge

+0

Depende de lo que esté utilizando la búsqueda en la matriz. Sin usar comparadores, creo que la mejor manera es recorrer el conjunto y verificar cada cadena para buscar. NSString * searchString; para (NSString * cadena en la matriz) { si ([string rangeOfString: searchstring opciones: NSCaseInsensitiveSearch]! = .location NSNotFound) {// No en cadena } else { // En esta cadena } } A continuación, puede agregar las cadenas que lo contienen a una nueva matriz mutable que le permite mostrarlas si está buscando –

+0

ps El formato es correcto en el código anterior, pero obviamente se purga al estar en un comentario –

3

espero que esto le ayuda, .. añadir esta línea al archivo .m o crear una clase separada e integrar este código.

@implementation NSString (Contains) 

- (BOOL) containsString: (NSString*) substring 
{ 
NSRange range = [self rangeOfString : substring]; 
BOOL found = (range.location != NSNotFound); 
return found; 
}  
@end 
2

Con iOS 8 y Swift, podemos utilizar el método localizedCaseInsensitiveContainsString

let string: NSString = "Café" 
let substring: NSString = "É" 

string.localizedCaseInsensitiveContainsString(substring) // true 
+0

demasiado temprano , pero bueno para el futuro –

19

En iOS8 ahora se puede utilizar:

BOOL containsString = [@"Here is my string." containsString:@"is"]; 

Hay un interesante post sobre la forma de "adaptar" se para iOS7 aquí: http://petersteinberger.com/blog/2014/retrofitting-containsstring-on-ios-7/

+0

Sería un buen método práctico. Desafortunadamente no está documentado y, por lo tanto, es una API privada – Centurion

+2

Definitivamente no es una API privada. Mira el archivo NSString.h y lo verás. –

Cuestiones relacionadas