Як дізнатися, чи починається NSString з певної іншої рядки?


152

Я намагаюся перевірити, чи починається рядок, який я буду використовувати як URL, починаючи з http. Те, що я зараз намагаюся перевірити, здається, не працює. Ось мій код:

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

Будь-які ідеї?

Відповіді:


331

Спробуйте це: if ([myString hasPrefix:@"http"]).

До речі, ваш тест повинен бути != NSNotFoundзамість == NSNotFound. Але скажіть, що ваша URL-адреса ftp://my_http_host.com/thingзбігається, але не повинна.


Так, це було все. Я повинен був помітити річ! = Раніше, але врешті-решт спрацьовував саме hasPrefix. Дякую за пораду, я позначу вашу як правильну відповідь, як тільки мені це дозволять.
Роб

23

Мені подобається використовувати цей метод:

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

або навіть простіше:

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

1
Це теж добре. Цей спосіб також трохи гнучкіший, дякую за коментар
Роб

2
Це вийде з ладу, якщо темп-рядок менше 5 символів. Індекс починається з 0. Тож це не є гарною відповіддю. Також у прикладі є невідповідність кількості символів: "http" не містить 5 символів. Слід також враховувати нечутливість випадку.
Даніель

@Daniel Що ти навіть кажеш? Чому 5? Це не NSArray ... Індекс 4 - це 4-й символ, а не 5-й! А ви коли-небудь бачили Http чи hTtP? Залежно від регістру не має значення. Також питання стосувалося перевірки того, чи починається рядок з http, а не про те, що рядок коротший за 4 символи hasPrefix: краще, але це працює так само добре. Перестаньте
скуголити

3
@JonasG - Так, ви правильно ставитесь до поведінки substringToIndex. Зауважте, проте, індекс 4 насправді є 5-м символом; індекс 0 - перший символ. Я помилково припустив, що substringToIndex включає символ, визначений індексом, але це не так. Чутливість до регістру є актуальною, коли йдеться про введення користувачів, на що, на мою думку, це натякає Розглянемо випадок " HTTP: // WWW ...". Але найбільша проблема полягає в тому, що запропоноване рішення викине виняток, коли воно зустріне "ftp" або рядок менше 4 символів. Метод hasPrefix не має тієї ж проблеми.
Даніель

6

Якщо ви перевіряєте на "http:", ви, ймовірно, захочете нечутливий до регістру пошук:

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

2

Швидка версія:

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

Я не знаю, чому це було знято з голосом ... це простий швидкий спосіб зробити це. Більшість нових розробників iOS, ймовірно, будуть використовувати Swift відтепер, і ОП ніколи не говорила, що вимагаються лише відповіді Objective-C.
Річард

"Я не знаю, чому це було знято з голосу" - можливо, тому, що синтаксис неправильний? Повинен бути if line.hasPrefix("prefix"){} `
superarts.org

1
Дякуємо, що вказали на простіший синтаксис, але розміщення () навколо оператора if не є поганим синтаксисом. Для деяких із нас старих таймерів воно читається чіткіше і працює точно так само. if (line.hasPrefix("#")) {}працює так само добре.
Річард

-1

Це моє вирішення проблеми. Це видалить літери, які не потрібні та є нечутливими до регістру.

    - (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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.