Как узнать, начинается ли строка 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];

Любые идеи?

Ответы:


332

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

Кстати, ваш тест должен быть != NSNotFoundвместо == NSNotFound. Но скажите, что ваш URL есть ftp://my_http_host.com/thing, он будет соответствовать, но не должен.


Да это было это. Я должен был заметить вещь! = Раньше, но в конце концов это был hasPrefix, который работал. Спасибо за совет, я отмечу ваш как правильный ответ, как только он позволит мне.
Роб

24

Мне нравится использовать этот метод:

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: лучше, но это работает так же хорошо. Хватит ныть
JonasG

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

Swift версия:

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

Я не знаю, почему за это проголосовали ... это простой способ Свифта сделать это. С этого момента большинство новых разработчиков iOS, вероятно, будут использовать Swift, и OP никогда не говорил, что запрашиваются только ответы 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.