如何查看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];

有任何想法吗?

Answers:


331

试试这个:if ([myString hasPrefix:@"http"])

顺便说一句,您的测试应!= NSNotFound改为== NSNotFound。但是说您的网址是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
那也很好。这种方式也更加灵活,感谢您的评论
Rob

2
如果临时字符串少于5个字符,则会崩溃。索引从0开始。因此,这不是一个好答案。此外,该示例还有一个字符计数不匹配:“ http”没有5个字符。还应考虑不区分大小写。
丹尼尔(Daniel)

@Daniel你在说什么?为什么是5?这不是NSArray ...索引4是第4个字符,而不是第5个字符!您有没有看过Http或hTtP?区分大小写无关。还有一个问题是关于检查字符串是否以http开头,而不是字符串短于4个字符。hasPrefix:更好,但是效果也一样。停止抱怨
JonasG

3
@JonasG-是的,您对substringToIndex的行为是正确的。但是请注意,索引4实际上是第5个字符;索引0是第一个字符。我错误地认为substringToIndex包含索引指定的字符,但事实并非如此。当涉及到用户输入时,区分大小写是相关的,我相信这个问题暗示了这一点。考虑“ HTTP:// WWW ...”的情况。但是最大的问题是,提出的解决方案在遇到“ ftp”或少于4个字符的字符串时将引发异常。hasPrefix方法没有相同的问题。
丹尼尔(Daniel)

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 "#"
}

我不知道为什么这会被否决...这是Swift的简单方法。从现在开始,大多数新的iOS开发人员可能会使用Swift,OP从来没有说过只要求Objective-C答案。
理查德(Richard)

“我不知道为什么这被否决了”-可能是因为语法错误?应该是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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.