Como posso verificar se uma string ( NSString
) contém outra string menor?
Eu esperava algo como:
NSString *string = @"hello bla bla";
NSLog(@"%d",[string containsSubstring:@"hello"]);
Mas o mais próximo que pude encontrar foi:
if ([string rangeOfString:@"hello"] == 0) {
NSLog(@"sub string doesnt exist");
}
else {
NSLog(@"exists");
}
Enfim, essa é a melhor maneira de descobrir se uma string contém outra string?
if ([string rangeOfString:@"hello"] == 0) {...}
há um erro de incompatibilidade de tipo para NSRange e int. para corrigir isso, você deve alterar a linha para o seguinte:if ([string rangeOfString:@"hello"].length == 0) {...}
Respostas:
A chave é perceber que
rangeOfString:
retorna umaNSRange
estrutura e a documentação diz que ela retornará a estrutura{NSNotFound, 0}
se o "palheiro" não contiver a "agulha".E se você estiver no iOS 8 ou no OS X Yosemite, agora pode: (* NOTA: Isso travará seu aplicativo se esse código for chamado em um dispositivo iOS7).
(Também é assim que funcionaria no Swift)
👍
fonte
[string rangeOfString:@"bla"].location != NSNotFound
será verdadeira quando string fornil
!Para iOS 8.0+ e macOS 10.10+, você pode usar o nativo do NSString
containsString:
.Para versões mais antigas do iOS e macOS, você pode criar sua própria categoria (obsoleta) para o NSString:
Nota: Observe o comentário de Daniel Galasko abaixo sobre nomeação
fonte
return [self rangeOfString:substring].location != NSNotFound;
e o incluí na minha biblioteca de refatoração, es_ios_utils. github.com/peterdeweese/es_ios_utilsComo esse parece ser um resultado de alta classificação no Google, quero adicionar o seguinte:
O iOS 8 e o OS X 10.10 adicionam o
containsString:
método aNSString
. Uma versão atualizada do exemplo de Dave DeLong para esses sistemas:fonte
// Como alternativa, você também pode usar o seguinte:
fonte
Com o iOS 8 e o Swift , podemos usar o
localizedCaseInsensitiveContainsString
métodofonte
Então, pessoalmente, eu realmente odeio,
NSNotFound
mas entendo sua necessidade.Mas algumas pessoas podem não entender as complexidades da comparação com o NSNotFound
Por exemplo, este código:
tem seus problemas:
1) Obviamente, se
otherString = nil
este código falhar. um teste simples seria:resulta em !! BATIDA !!
2) O que não é tão óbvio para alguém novo no objetivo-c é que o mesmo código NÃO trava quando
string = nil
. Por exemplo, este código:e este código:
ambos resultarão em
O que claramente não é o que você deseja.
Portanto, a melhor solução que eu acredito que funciona é usar o fato de rangeOfString retornar o comprimento 0, então um código melhor e mais confiável é o seguinte:
OU SIMPLESMENTE:
que retornará para os casos 1 e 2
Esses são meus 2 centavos ;-)
Verifique meu Gist para obter mais códigos úteis.
fonte
Uma versão aprimorada da solução de Pi , uma categoria no NSString, que não apenas informa se uma string é encontrada em outra string, mas também usa um intervalo por referência, é:
Use-o como:
fonte
Aqui está um trecho de função de copiar e colar:
fonte
Oneliner (menor quantidade de código. SECO, pois você possui apenas um
NSLog
):fonte
fonte
tente isso,
fonte
Melhor solução. Tão simples como isso! Se você deseja encontrar uma palavra ou parte da string. Você pode usar esse código. Neste exemplo, vamos verificar se o valor da palavra contém "acter".
fonte
No Swift 4:
fonte
Se você precisar disso, escreva uma vez:
fonte
Em caso de rápida, isso pode ser usado
fonte
Se não se preocupe com a seqüência que diferencia maiúsculas de minúsculas. Tente isso uma vez.
fonte
Por favor use este código
fonte
Use a opção NSCaseInsensitiveSearch com rangeOfString: options:
Resultado da saída encontrado: Sim
As opções podem ser "or'ed" juntas e incluem:
NSCaseInsensitiveSearch NSLiteralSearch NSBackwardsSearch e mais
fonte
A primeira string contém ou não a segunda string,
fonte
Tente o seguinte:
Swift 4.1, 4.2:
Para Objective-C:
fonte
Swift 4 e acima
Objetivo-C
fonte
fonte
String
tipo. Em segundo lugar, temos todos os objetos. Então, como argumento, você deve passarNSString
. Eu voto pela exclusão devido à má qualidade de uma resposta sob uma pergunta altamente ativa.Se for necessária uma certa posição da string, esse código ocorrerá no Swift 3.0 :
fonte