Detectando se um NSString contém…?

124

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.

Alex
fonte
possível duplicata da pesquisa NSString Cocoa?
Kennytm 20/07
26
você pode aceitar uma resposta?
Jacob Relkin
Uma solução barata e suja, se se presume que a string não contém pontuação, é concatenar espaços em branco na frente e no verso de AMBAS as strings, e então sim rangeOfString.
Hot Licks

Respostas:

192

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
Jacob Relkin
fonte
2
Na verdade, você pode simplesmente adicionar espaço no início e no fim da corda e "é" irá corresponder a seqüência começa com "é"
user4951
Surpreende-me que isso não faça parte da classe padrão. Obrigado, @ Jacob!
21133 big_m
1
Na verdade, o "comprimento" do NSRange deve ser testado ... não a "localização" .Aqui é diretamente da fonte: "Esses métodos retornam comprimento == 0 se a cadeia de destino não for encontrada. Portanto, para verificar a contenção: ([ str rangeOfString: @ "target"]. length> 0). Observe que o comprimento do intervalo retornado por esses métodos pode ser diferente do comprimento da string de destino, devido aos caracteres compostos e tal. "
precisa saber é o seguinte
A partir do iOS 8.0, existe um novo método chamado containsStringexposto no NSString.
tedyyu
89

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");
}
Amit Singh
fonte
como posso obter os locais quando uso esse método em uma matriz?
juiz
Depende do que você está usando a pesquisa na matriz. Sem usar comparadores, acho que a melhor maneira é percorrer o array e verificar cada string pela string de pesquisa. NSString * searchString; for (NSString * string na matriz) {if ([string rangeOfString: searchString options: NSCaseInsensitiveSearch] .location! = NSNotFound) {// Não está na string} else {// Nesta string}} Você pode adicionar as cadeias que contê-lo para uma nova matriz mutável que lhe permite mostrar-lhes se você estiver procurando
simon_smiley
ps A formatação é tudo correto no código acima, mas, obviamente, fica amassada por estar em um comentário
simon_smiley
22

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/

siburb
fonte
Seria um método útil muito bom. Infelizmente, ele não está documentado e, portanto, é uma API privada
Centurion
2
Definitivamente, não é uma API privada. Confira o arquivo NSString.h e você o verá.
Brian Sachetta
3

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.

Heath Borders
fonte
3

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
Maniganda saravanan
fonte
2

Com o iOS 8 e Swift, podemos usar o método localizedCaseInsensitiveContainsString

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

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

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.

Hot Licks
fonte