¿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.


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

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");
}

¿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


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.


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

2

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

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

 string.localizedCaseInsensitiveContainsString(substring) // true

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.