¿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.
rangeOfString.
¿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.
rangeOfString.
Respuestas:
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
containsStringexpuesto en NSString.
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");
}
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/
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.
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
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.