Bagaimana cara melihat apakah NSString dimulai dengan string lain tertentu?


152

Saya mencoba memeriksa untuk melihat apakah string yang akan saya gunakan sebagai URL dimulai dengan http. Cara saya mencoba memeriksa sekarang sepertinya tidak berfungsi. Ini kode saya:

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

Ada ide?

Jawaban:


331

Coba ini: if ([myString hasPrefix:@"http"]).

Omong-omong, tes Anda seharusnya != NSNotFoundbukan == NSNotFound. Tapi katakan URL Anda ftp://my_http_host.com/thing, itu akan cocok tetapi tidak seharusnya.


Ya itu dia. Saya seharusnya memperhatikan! = Hal sebelumnya, tetapi pada akhirnya itu adalah hasPrefix yang berfungsi. Terima kasih atas sarannya, saya akan menandai jawaban Anda sebagai jawaban yang benar segera setelah itu memungkinkan saya.
Rob

23

Saya suka menggunakan metode ini:

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

atau bahkan lebih mudah:

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

1
Itu bagus juga. Cara ini sedikit lebih fleksibel juga, terima kasih atas komentarnya
Rob

2
Ini akan macet jika string temp kurang dari 5 karakter. Indeks dimulai dari 0. Jadi ini bukan jawaban yang bagus. Juga, contoh memiliki ketidakcocokan jumlah karakter: "http" tidak memiliki 5 karakter. Ketidakpekaan terhadap kasus juga harus dipertimbangkan.
Daniel

@Aniel Apa yang Anda katakan? Mengapa 5? Ini bukan NSArray ... Indeks 4 adalah karakter ke-4, bukan ke-5! Dan pernahkah Anda melihat Http atau hTtP? Peka huruf besar kecil tidak relevan. Juga pertanyaannya adalah tentang memeriksa apakah string dimulai dengan http bukan tentang string yang lebih pendek dari 4 karakter. hasPrefix: lebih baik tetapi ini berfungsi dengan baik. Berhenti merengek
JonasG

3
@ JonasG - Ya, Anda benar tentang perilaku substringToIndex. Catatan, bagaimanapun, indeks 4 sebenarnya adalah karakter ke-5; indeks 0 adalah karakter pertama. Saya keliru berasumsi bahwa substringToIndex termasuk karakter yang ditentukan oleh indeks, tetapi tidak. Sensitivitas kasus relevan ketika input pengguna terlibat, dan saya yakin pertanyaannya mengisyaratkan. Pertimbangkan kasus " HTTP: // WWW ...". Tetapi masalah terbesar adalah bahwa solusi yang diusulkan akan melemparkan pengecualian ketika bertemu "ftp" atau string kurang dari 4 karakter. Metode hasPrefix tidak memiliki masalah yang sama.
Daniel

6

Jika Anda memeriksa "http:", Anda mungkin ingin pencarian case-sensitive:

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

2

Versi cepat:

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

Saya tidak tahu mengapa ini dipilih ... ini adalah cara sederhana Swift untuk melakukan ini. Sebagian besar pengembang iOS baru mungkin akan menggunakan Swift mulai saat ini, dan OP tidak pernah mengatakan bahwa hanya jawaban Objective-C yang diminta.
Richard

"Saya tidak tahu mengapa ini tidak dipilih" - mungkin karena sintaksnya salah? Seharusnya if line.hasPrefix("prefix"){} `
superarts.org

1
Terima kasih telah menunjukkan sintaks yang lebih sederhana, tetapi menempatkan () di sekitar pernyataan if bukan sintaks yang buruk. Bagi sebagian dari kita penghitung waktu lama, bacaannya lebih jelas, dan kerjanya persis sama. if (line.hasPrefix("#")) {}berfungsi juga.
Richard

-1

Ini solusi saya untuk masalah ini. Ini akan menghapus huruf-huruf yang tidak perlu dan tidak sensitif huruf besar-kecil.

    - (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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.