Como posso detectar se uma string contém uma determinada palavra? Por exemplo, eu tenho uma string abaixo da qual diz:
@"Here is my string."
Gostaria de saber se consigo detectar uma palavra na string, como "is", por exemplo.
rangeOfString.
Como posso detectar se uma string contém uma determinada palavra? Por exemplo, eu tenho uma string abaixo da qual diz:
@"Here is my string."
Gostaria de saber se consigo detectar uma palavra na string, como "is", por exemplo.
rangeOfString.
Respostas:
Aqui está como eu faria isso:
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...
}
}
Você pode facilmente adicionar isso como uma categoria em 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
containsStringexposto no NSString.
Use o código a seguir para digitalizar a palavra na frase.
NSString *sentence = @"The quick brown fox";
NSString *word = @"quack";
if ([sentence rangeOfString:word].location != NSNotFound) {
NSLog(@"Yes it does contain that word");
}
No iOS8, agora você pode usar:
BOOL containsString = [@"Here is my string." containsString:@"is"];
Há um post interessante sobre como "atualizá-lo" para o iOS7 aqui: http://petersteinberger.com/blog/2014/retrofitting-containsstring-on-ios-7/
Eu recomendo usar o NSLinguisticTagger . Podemos usá-lo para pesquisarHere 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]);
}];
Isso gera:
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 isthmusaté identifica isdentro de isn't.
Espero que isso ajude você .. adicione esta linha no arquivo .m ou crie uma classe separada e integre esse código.
@implementation NSString (Contains)
- (BOOL) containsString: (NSString*) substring
{
NSRange range = [self rangeOfString : substring];
BOOL found = ( range.location != NSNotFound );
return found;
}
@end
Uma solução completa primeiro procuraria a sequência (sem espaços em branco adicionados) e depois verificaria se o caractere imediatamente anterior está em branco ou no início da linha. Da mesma forma, verifique se o caractere imediatamente seguinte está em branco ou no final da linha. Se ambos os testes passarem, você terá uma correspondência. Dependendo de suas necessidades, você também pode verificar se há ,, ., (), etc.
Uma abordagem alternativa, é claro, é analisar a sequência em palavras e verificar cada palavra individualmente.