จะดูว่า 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 ที่ใช้งานได้ ขอบคุณสำหรับคำแนะนำฉันจะทำเครื่องหมายคำตอบว่าถูกต้องทันทีที่ฉันอนุญาต
Rob

23

ฉันชอบที่จะใช้วิธีนี้:

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

หรือง่ายยิ่งขึ้น:

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

1
ก็เป็นสิ่งที่ดีเช่นกัน วิธีนี้ยืดหยุ่นเล็กน้อยเช่นกันขอบคุณสำหรับความคิดเห็น
Rob

2
สิ่งนี้จะล้มเหลวหากสตริง temp น้อยกว่า 5 ตัวอักษร ดัชนีเริ่มต้นที่ 0 ดังนั้นนี่ไม่ใช่คำตอบที่ดี นอกจากนี้ตัวอย่างมีจำนวนอักขระไม่ตรงกัน: "http" ไม่มีอักขระ 5 ตัว ควรคำนึงถึงความรู้สึกตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
แดเนียล

@Daniel คุณกำลังพูดอะไรอยู่? ทำไมต้อง 5 นี่ไม่ใช่ NSArray ... Index 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("#")) {}ทำงานได้เช่นกัน
Richard

-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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.