¿Detectando si un NSString contiene ...?

124

¿Cómo puedo detectar si una cadena contiene una palabra determinada? Por ejemplo, tengo una cadena debajo que dice:

@"Here is my string."

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

Alex
fuente
posible duplicado de Searching NSString Cocoa?
kennytm
26
puedes aceptar una respuesta?
Jacob Relkin
Una solución barata y sucia, si se supone que la cadena no contiene signos de puntuación, es concatenar espacios en blanco en el frente y la parte posterior de AMBAS cadenas, y luego hacerlo rangeOfString.
Hot Licks

Respuestas:

192

Así es como 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...
   }
}

Puede agregar esto fácilmente como 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
Jacob Relkin
fuente
2
En realidad, puede agregar espacio al principio y al final de la cadena y "is" coincidirá con la cadena comienza con "is"
user4951
Me sorprende que estos no sean parte de la clase estándar. ¡Gracias, @Jacob!
big_m
1
En realidad, la "longitud" de NSRange debe probarse ... no "ubicación". Aquí es directamente de la fuente: "Estos métodos devuelven longitud == 0 si no se encuentra la cadena de destino. Entonces, para verificar la contención: ([ str rangeOfString: @ "target"]. length> 0). Tenga en cuenta que la longitud del rango devuelto por estos métodos puede ser diferente de la longitud de la cadena de destino, debido a los caracteres compuestos y demás ".
GtotheB
A partir de iOS 8.0, hay un nuevo método llamado containsStringexpuesto en NSString.
tedyyu
89

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

NSString *sentence = @"The quick brown fox";
NSString *word = @"quack";
if ([sentence rangeOfString:word].location != NSNotFound) {
    NSLog(@"Yes it does contain that word");
}
Amit Singh
fuente
¿Cómo puedo obtener las ubicaciones cuando uso este método en una matriz?
juez
Depende de lo que esté utilizando la búsqueda en la matriz. Sin usar comparadores, creo que la mejor manera es recorrer la matriz y verificar cada cadena para la cadena de búsqueda. NSString * searchString; for (NSString * string in array) {if ([string rangeOfString: searchString options: NSCaseInsensitiveSearch] .location! = NSNotFound) {// Not in string} else {// En esta cadena}} Luego puede agregar las cadenas que contenerlo en una nueva matriz mutable que le permite mostrarlos si está buscando
simon_smiley
ps El formato es todo correcto en el código anterior, pero obviamente se machaca al estar en un comentario
simon_smiley
22

En iOS8 ahora puede usar:

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

Aquí hay una publicación interesante sobre cómo "adaptarla" a iOS7: http://petersteinberger.com/blog/2014/retrofitting-containsstring-on-ios-7/

siburb
fuente
Sería un método muy bueno y práctico. Lamentablemente no está documentado y, por lo tanto, es una API privada
Centurion
2
Definitivamente no es una API privada. Consulte el archivo NSString.h y lo verá.
Brian Sachetta
3

Recomiendo usar NSLinguisticTagger . Podemos usarlo para buscarHere 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]);
                            }];

Esto produce:

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 His mississippie isthmusincluso se identifica isdentro de isn't.

Heath Borders
fuente
3

Espero que esto te ayude ... agrega esta línea en el archivo .m o crea una clase separada e integra este código.

@implementation NSString (Contains)

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

Con iOS 8 y Swift, podemos usar el método localizadoCaseInsensitiveContainsString

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

 string.localizedCaseInsensitiveContainsString(substring) // true
Govind
fuente
0

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

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

Hot Licks
fuente