Làm thế nào để xem nếu một NSString bắt đầu với một chuỗi khác?


152

Tôi đang cố kiểm tra xem một chuỗi mà tôi sẽ sử dụng làm URL bắt đầu bằng http. Cách tôi đang cố kiểm tra ngay bây giờ dường như không hoạt động. Đây là mã của tôi:

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

Có ý kiến ​​gì không?

Câu trả lời:


331

Hãy thử điều này : if ([myString hasPrefix:@"http"]).

Nhân tiện, bài kiểm tra của bạn nên được != NSNotFoundthay vì == NSNotFound. Nhưng nói rằng URL của bạn là ftp://my_http_host.com/thing, nó sẽ phù hợp nhưng không nên.


Yup đó là nó. Tôi đáng lẽ phải chú ý đến! = Điều trước đó, nhưng cuối cùng thì nó đã có hasPrefix hoạt động. Cảm ơn vì lời khuyên, tôi sẽ đánh dấu câu trả lời đúng của bạn ngay khi nó cho phép tôi.
Cướp

23

Tôi thích sử dụng phương pháp này:

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

hoặc thậm chí dễ dàng hơn:

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

1
Đó cũng là tốt. Cách này cũng linh hoạt hơn một chút, cảm ơn vì nhận xét
Rob

2
Điều này sẽ sụp đổ nếu chuỗi temp dưới 5 ký tự. Chỉ số bắt đầu từ 0. Vì vậy, đây không phải là một câu trả lời tốt. Ngoài ra, ví dụ có số lượng ký tự không khớp: "http" không có 5 ký tự. Trường hợp không nhạy cảm cũng nên được xem xét.
Daniel

@Daniel Bạn thậm chí đang nói gì? Tại sao 5? Đây không phải là NSArray ... Index 4 là nhân vật thứ 4 không phải thứ 5! Và bạn đã bao giờ nhìn thấy http hoặc hTtP chưa? Trường hợp nhạy cảm không liên quan. Ngoài ra câu hỏi là về việc kiểm tra xem chuỗi có bắt đầu bằng http không về chuỗi có ngắn hơn 4 ký tự hay không. hasPrefix: tốt hơn nhưng nó cũng hoạt động tốt. Ngừng than vãn
JonasG

3
@JonasG - Vâng, bạn đã đúng về hành vi của chuỗi con To Index. Lưu ý, tuy nhiên, chỉ số 4 thực sự là ký tự thứ 5; chỉ số 0 là ký tự đầu tiên. Tôi đã nhầm tưởng rằng chuỗi conTo Index bao gồm ký tự được chỉ định bởi chỉ mục, nhưng thực tế thì không. Độ nhạy trường hợp có liên quan khi đầu vào của người dùng có liên quan, mà tôi tin rằng gợi ý câu hỏi tại. Hãy xem xét trường hợp " HTTP: // WWW ...". Nhưng vấn đề lớn nhất là giải pháp được đề xuất sẽ đưa ra một ngoại lệ khi nó gặp "ftp" hoặc một chuỗi nhỏ hơn 4 ký tự. Phương thức hasPrefix không có cùng một vấn đề.
Daniel

6

Nếu bạn đang kiểm tra "http:" có thể bạn sẽ muốn tìm kiếm không phân biệt chữ hoa chữ thường:

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

2

Phiên bản Swift:

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

Tôi không biết tại sao điều này lại bị bỏ phiếu ... đây là cách Swift đơn giản để làm việc này. Hầu hết các nhà phát triển iOS mới có thể sẽ sử dụng Swift từ đây trở đi và OP không bao giờ nói rằng chỉ có câu trả lời Objective-C được yêu cầu.
Richard

"Tôi không biết tại sao điều này lại bị bỏ phiếu" - có lẽ vì cú pháp sai? Nên là if line.hasPrefix("prefix"){} `
superarts.org

1
Cảm ơn bạn đã chỉ ra một cú pháp đơn giản hơn, nhưng đặt () xung quanh một câu lệnh if không phải là cú pháp xấu. Đối với một số người trong chúng ta, bộ đếm thời gian cũ, nó đọc rõ hơn và hoạt động chính xác như nhau. if (line.hasPrefix("#")) {}hoạt động tốt như vậy.
Richard

-1

Đây là giải pháp của tôi cho vấn đề. Nó sẽ loại bỏ các chữ cái không cần thiết và không phân biệt chữ hoa chữ thường.

    - (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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.