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.


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

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

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


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.


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

2

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

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

 string.localizedCaseInsensitiveContainsString(substring) // true

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.