Come vedere se una NSString inizia con una determinata altra stringa?


152

Sto cercando di verificare se una stringa che sto per utilizzare come URL inizia con http. Il modo in cui sto provando a controllare in questo momento non sembra funzionare. Ecco il mio codice:

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];

Qualche idea?

Risposte:


331

Prova questo: if ([myString hasPrefix:@"http"]).

A proposito, il tuo test dovrebbe essere != NSNotFoundinvece di == NSNotFound. Ma supponiamo che il tuo URL sia ftp://my_http_host.com/thing, corrisponderà ma non dovrebbe.


Sì, era quello. Avrei dovuto notare prima la cosa! =, Ma alla fine è stato l'haprefix a funzionare. Grazie per il consiglio, segnerò la tua come risposta corretta non appena me lo consente.
Rob,

23

Mi piace usare questo metodo:

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

o ancora più semplice:

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

1
Anche questo va bene. In questo modo è anche un po 'più flessibile, grazie per il commento
Rob,

2
Questo si arresterà in modo anomalo se la stringa temporanea è inferiore a 5 caratteri. L'indice inizia da 0. Quindi questa non è una buona risposta. Inoltre, l'esempio ha una mancata corrispondenza del conteggio dei caratteri: "http" non ha 5 caratteri. Insensibilità al caso dovrebbe essere presa in considerazione.
Daniel,

@Daniel Cosa stai dicendo? Perché 5? Questo non è un NSArray ... L'indice 4 è il 4 ° carattere non il 5 °! E hai mai visto Http o hTtP? La distinzione tra maiuscole e minuscole non è pertinente. Inoltre, la domanda riguardava il controllo se la stringa inizia con http non sulla stringa di lunghezza inferiore a 4 caratteri. hasPrefix: è meglio ma funziona altrettanto bene. Smetti di piagnucolare
JonasG il

3
@JonasG - Sì, hai ragione sul comportamento della sottostringa ToIndex. Nota, tuttavia, l'indice 4 è in realtà il 5 ° carattere; indice 0 è il primo carattere. Ho erroneamente ipotizzato che substringToIndex includa il carattere specificato dall'indice, ma non lo è. La distinzione tra maiuscole e minuscole è rilevante quando è coinvolto l'input dell'utente, che a mio avviso suggerisce la domanda. Si consideri il caso di " HTTP: // WWW ...". Ma il problema più grande è che la soluzione proposta genererà un'eccezione quando incontra "ftp" o una stringa di meno di 4 caratteri. Il metodo hasPrefix non ha lo stesso problema.
Daniel,

6

Se stai cercando "http:" probabilmente vorrai una ricerca senza distinzione tra maiuscole e minuscole:

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

2

Versione rapida:

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

Non so perché sia ​​stato votato in negativo ... questo è il semplice modo rapido di farlo. La maggior parte dei nuovi sviluppatori iOS utilizzerà Swift da questo momento in poi, e l'OP non ha mai detto che erano richieste solo le risposte Objective-C.
Richard,

"Non so perché questo sia stato sottovalutato" - probabilmente perché la sintassi è sbagliata? Dovrebbe essereif line.hasPrefix("prefix") {} `
superarts.org il

1
Grazie per aver sottolineato una sintassi più semplice, ma posizionare () attorno a un'istruzione if non è una sintassi errata. Per alcuni di noi vecchi timer, legge più chiaramente e funziona esattamente allo stesso modo. if (line.hasPrefix("#")) {}funziona altrettanto bene.
Richard,

-1

Questa è la mia soluzione al problema. Rimuoverà le lettere che non sono necessarie e non fa distinzione tra maiuscole e minuscole.

    - (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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.