Como ver se um NSString começa com uma outra outra string?


152

Estou tentando verificar se uma sequência que vou usar como URL começa com http. A maneira como estou tentando verificar agora não parece estar funcionando. Aqui está o meu código:

NSMutableString *temp = [[NSMutableString alloc] initWithString:@"http://"];
if ([businessWebsite rangeOfString:@"http"].location == NSNotFound){
    NSString *temp2 = [[NSString alloc] init];
    temp2 = businessWebsite;
    [temp appendString:temp2];
    businessWebsite = temp2;
    NSLog(@"Updated BusinessWebsite is: %@", businessWebsite);
}

[web setBusinessWebsiteUrl:businessWebsite];

Alguma ideia?

Respostas:


331

Tente isto: if ([myString hasPrefix:@"http"]).

A propósito, seu teste deve ser em != NSNotFoundvez de == NSNotFound. Mas digamos que seu URL seja ftp://my_http_host.com/thing, ele corresponderá, mas não deve.


Sim, foi isso. Eu deveria ter notado a coisa! = Antes, mas no final foi o hasPrefix que funcionou. Obrigado pelo conselho, vou marcar o seu como a resposta correta assim que me permitir.
Rob

23

Eu gosto de usar este método:

if ([[temp substringToIndex:4] isEqualToString:@"http"]) {
  //starts with http
}

ou ainda mais fácil:

if ([temp hasPrefix:@"http"]) {
    //do your stuff
}

1
Isso também é bom. Desta forma, é um pouco mais flexível, bem, obrigado pelo comentário
Rob

2
Isso falhará se a string temporária tiver menos de 5 caracteres. O índice começa em 0. Portanto, essa não é uma boa resposta. Além disso, o exemplo tem uma incompatibilidade de contagem de caracteres: "http" não possui 5 caracteres. A insensibilidade ao caso também deve ser considerada.
27412 Daniel

@ Daniel Daniel O que você está dizendo? Por que 5? Este não é um NSArray ... O Índice 4 é o quarto caractere, não o quinto! E você já viu Http ou HTTP? A distinção entre maiúsculas e minúsculas não é relevante. Além disso, a pergunta era sobre verificar se a sequência começa com http e não sobre a sequência ter menos de 4 caracteres. hasPrefix: é melhor, mas isso também funciona. Parar de choramingar
JonasG

3
@ JonasG - Sim, você está correto sobre o comportamento de substringToIndex. Observe, no entanto, o índice 4 é realmente o quinto caractere; o índice 0 é o primeiro caractere. Eu assumi por engano que substringToIndex inclui o caractere especificado pelo índice, mas não. A distinção entre maiúsculas e minúsculas é relevante quando a entrada do usuário está envolvida, o que acredito que a pergunta sugere. Considere o caso de " HTTP: // WWW ...". Mas o maior problema é que a solução proposta lançará uma exceção quando encontrar "ftp" ou uma string com menos de 4 caracteres. O método hasPrefix não tem o mesmo problema.
Daniel

6

Se você estiver procurando por "http:", provavelmente desejará uma pesquisa que não diferencia maiúsculas de minúsculas:

NSRange prefixRange = 
    [temp rangeOfString:@"http" 
                options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
if (prefixRange.location == NSNotFound)

2

Versão rápida:

if line.hasPrefix("#") {
  // checks to see if a string (line) begins with the character "#"
}

Não sei por que isso foi rejeitado ... essa é a maneira simples e rápida de fazer isso. A maioria dos novos desenvolvedores de iOS provavelmente usará o Swift daqui em diante, e o OP nunca disse que apenas as respostas do Objective-C foram solicitadas.
Richard

"Não sei por que isso foi rejeitado" - provavelmente porque a sintaxe está errada? Deve ser if line.hasPrefix("prefix"){} `
superarts.org

1
Obrigado por apontar uma sintaxe mais simples, mas colocar () em torno de uma instrução if não é uma sintaxe ruim. Para alguns de nós, veteranos, ele lê com mais clareza e funciona exatamente da mesma maneira. if (line.hasPrefix("#")) {}funciona tão bem.
Richard

-1

Esta é a minha solução para o problema. Ele removerá as letras desnecessárias e não diferencia maiúsculas de minúsculas.

    - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    return [self generateSectionTitles];
}

-(NSArray *)generateSectionTitles {

    NSArray *alphaArray = [NSArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J", @"K", @"L", @"M", @"N", @"O", @"P", @"Q", @"R", @"S", @"T", @"U", @"V", @"W", @"X", @"Y", @"Z", nil];

    NSMutableArray *sectionArray = [[NSMutableArray alloc] init];

    for (NSString *character in alphaArray) {



        if ([self stringPrefix:character isInArray:self.depNameRows]) {
            [sectionArray addObject:character];
        }

    }

    return sectionArray;

}

-(BOOL)stringPrefix:(NSString *)prefix isInArray:(NSArray *)array {

    for (NSString *str in array) {

        //I needed a case insensitive search so [str hasPrefix:prefix]; would not have worked for me.
        NSRange prefixRange = [str rangeOfString:prefix options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
        if (prefixRange.location != NSNotFound) {
            return TRUE;
        }

    }

    return FALSE;

}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {

    NSInteger newRow = [self indexForFirstChar:title inArray:self.depNameRows];
    NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:newRow inSection:0];
    [tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];

    return index;
}

// Return the index for the location of the first item in an array that begins with a certain character
- (NSInteger)indexForFirstChar:(NSString *)character inArray:(NSArray *)array
{
    NSUInteger count = 0;
    for (NSString *str in array) {

        //I needed a case insensitive search so [str hasPrefix:prefix]; would not have worked for me.
        NSRange prefixRange = [str rangeOfString:character options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
        if (prefixRange.location != NSNotFound) {
            return count;
        }
        count++;
    }
    return 0;
}
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.