कैसे देखें कि क्या एक एनएसएसट्रिंग एक निश्चित अन्य स्ट्रिंग के साथ शुरू होता है?


152

मैं यह देखने के लिए जांच करने की कोशिश कर रहा हूं कि क्या एक स्ट्रिंग जिसे मैं यूआरएल के रूप में उपयोग करने जा रहा हूं वह 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, यह मेल खाएगा लेकिन ऐसा नहीं होना चाहिए।


हाँ, यह था। मुझे पहले! = बात पर ध्यान देना चाहिए था, लेकिन अंत में यह हप्रफिक्स था जिसने काम किया। सलाह के लिए धन्यवाद, मैं आपको सही उत्तर के रूप में जल्द ही चिह्नित करूंगा क्योंकि यह मुझे देता है।
रोब

23

मुझे इस विधि का उपयोग करना पसंद है:

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

या इससे भी आसान:

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

1
वह भी अच्छा। यह तरीका थोड़ा और लचीला होने के साथ-साथ टिप्पणी के लिए धन्यवाद है
रोब

2
यदि टेम्प स्ट्रिंग 5 वर्णों से कम है, तो यह क्रैश हो जाएगा। सूचकांक 0. पर शुरू होता है इसलिए यह एक अच्छा जवाब नहीं है। इसके अलावा, उदाहरण में एक वर्ण गणना बेमेल है: "http" में 5 वर्ण नहीं हैं। केस की असंवेदनशीलता पर भी विचार किया जाना चाहिए।
डैनियल

@ डैनियल तुम क्या कह रही हो? 5 क्यों? यह एक NSArray नहीं है ... इंडेक्स 4 5 वां नहीं, 4 वां चरित्र है! और क्या आपने कभी Http या hTtP देखा है? केस संवेदी प्रासंगिक नहीं है। यह भी जाँच करने के बारे में था कि क्या स्ट्रिंग http से शुरू होती है न कि स्ट्रिंग 4 अक्षरों से छोटी होने के बारे में। hasPrefix: बेहतर है, लेकिन यह काम भी करता है। रोना बंद करो
जोनास

3
@JonasG - हाँ, आप substringToIndex के व्यवहार के बारे में सही हैं। ध्यान दें, हालांकि, सूचकांक 4 वास्तव में 5 वां चरित्र है; सूचकांक 0 पहला चरित्र है। मैंने गलती से मान लिया था कि substringToIndex में इंडेक्स द्वारा निर्दिष्ट चरित्र शामिल है, लेकिन यह नहीं है। उपयोगकर्ता इनपुट शामिल होने पर केस संवेदनशीलता प्रासंगिक है, जो मुझे विश्वास है कि प्रश्न संकेत पर है। " HTTP: // WWW ..." के मामले पर विचार करें । लेकिन सबसे बड़ी समस्या यह है कि प्रस्तावित समाधान एक अपवाद को फेंक देगा जब यह "एफ़टीपी" या 4 वर्णों से कम स्ट्रिंग का सामना करता है। हैप्रिफ़िक्स विधि में समान समस्या नहीं है।
डैनियल

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

मुझे नहीं पता कि यह क्यों वोट किया गया था ... यह ऐसा करने का सरल स्विफ्ट तरीका है। अधिकांश नए आईओएस डेवलपर्स शायद स्विफ्ट का उपयोग यहां से बाहर करने जा रहे हैं, और ओपी ने कभी नहीं कहा कि केवल ऑब्जेक्टिव-सी उत्तर का अनुरोध किया गया था।
रिचर्ड

"मुझे नहीं पता कि यह क्यों डाउन-वोट किया गया था" - शायद इसलिए कि वाक्यविन्यास गलत है? होना चाहिए if line.hasPrefix("prefix"){} `
superarts.org

1
एक सरल वाक्यविन्यास को इंगित करने के लिए धन्यवाद, लेकिन एक बयान के चारों ओर रखने () खराब वाक्यविन्यास नहीं है। हम में से कुछ पुराने टाइमर के लिए, यह अधिक स्पष्ट रूप से पढ़ता है, और बिल्कुल वैसा ही काम करता है। 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.