NSString का विकल्प कैसे प्राप्त करें?


78

अगर मैं एनएसएसट्रिंग से एक मूल्य प्राप्त करना चाहता हूं, तो मुझे @"value:hello World:value"क्या उपयोग करना चाहिए?

मुझे जो रिटर्न वैल्यू चाहिए वह है @"hello World"



मैं इस सवाल को बंद करने के लिए मतदान कर रहा हूं क्योंकि यह स्पष्ट नहीं है कि आपका क्या पूछना है। यहाँ जो कुछ भी है, उसका बिल्कुल भी कोई संकेत नहीं है। क्या आप सिर्फ लौटना "hello World"चाहते हैं ? return @"hello World"। क्या आप कॉलोन के बीच बस वापस जाना चाहते हैं? क्या आप बाईं-सबसे बृहदान्त्र के बायीं ओर और दाएं-सबसे अधिक बृहदान्त्र के सब कुछ पट्टी करना चाहते हैं? इस प्रश्न के लिए कोई स्पष्ट रूप से परिभाषित इनपुट-आउटपुट मानदंड नहीं है (जैसा कि हम उन प्रश्नों की परिणामी सूची के साथ देखते हैं जो सभी दृष्टिकोण के एक जंगली सरणी के साथ समस्या को हल करते हैं)।
nhgrif

जवाबों:


158

विकल्प 1:

NSString *haystack = @"value:hello World:value";
NSString *haystackPrefix = @"value:";
NSString *haystackSuffix = @":value";
NSRange needleRange = NSMakeRange(haystackPrefix.length,
                                  haystack.length - haystackPrefix.length - haystackSuffix.length);
NSString *needle = [haystack substringWithRange:needleRange];
NSLog(@"needle: %@", needle); // -> "hello World"

विकल्प 2:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^value:(.+?):value$" options:0 error:nil];
NSTextCheckingResult *match = [regex firstMatchInString:haystack options:NSAnchoredSearch range:NSMakeRange(0, haystack.length)];
NSRange needleRange = [match rangeAtIndex: 1];
NSString *needle = [haystack substringWithRange:needleRange];

हालांकि यह आपके बल्कि तुच्छ मामले के लिए थोड़ा ऊपर हो सकता है।

विकल्प 3:

NSString *needle = [haystack componentsSeparatedByString:@":"][1];

यह विभाजन करते समय तीन अस्थायी तार और एक सरणी बनाता है।


सभी स्निपेट्स मानते हैं कि जो खोजा गया है वह वास्तव में स्ट्रिंग में निहित है।


यह NSAnchoredSearch पर रोया ... शायद NSMatchingAnchored बेहतर है।
जॉनी

74

यहाँ थोड़ा कम जटिल उत्तर है:

NSString *myString = @"abcdefg";
NSString *mySmallerString = [myString substringToIndex:4];

SubstringWithRange और substringFromIndex भी देखें


1
क्षमा करें, यह प्रश्न का उत्तर नहीं देता है (स्ट्रिंग के मध्य से प्रतिस्थापन कैसे प्राप्त करें)।
मोनोलो

वह क्या करता है
१०:

17

यहाँ एक सरल कार्य है जो आपको वह काम करने देता है जो आप खोज रहे हैं:

- (NSString *)getSubstring:(NSString *)value betweenString:(NSString *)separator
{
    NSRange firstInstance = [value rangeOfString:separator];
    NSRange secondInstance = [[value substringFromIndex:firstInstance.location + firstInstance.length] rangeOfString:separator];
    NSRange finalRange = NSMakeRange(firstInstance.location + separator.length, secondInstance.location);

    return [value substringWithRange:finalRange];
}

उपयोग:

NSString *myName = [self getSubstring:@"This is my :name:, woo!!" betweenString:@":"];

1
यदि यह रोशन हो रहा है, तो मैं आपको दूसरे उत्तर के मतदान के लिए अपना कारण बता सकता हूं। मैं छह के बजाय कोड की दो पंक्तियाँ लिखूंगा।
ले मोट जूस

2
समस्या यह है कि कोड की वे दो पंक्तियाँ केवल एक विशिष्ट मामले को हल करती हैं जो किसी के लिए कभी भी मौजूद नहीं होगी - शायद यह उस व्यक्ति के लिए भी नहीं है जिसने इसे पूछा था।
गेरेट

getSubstring:…इसे कहा जाना चाहिए substringInString:…क्योंकि आप इसे एक विकल्प नहीं दे रहे हैं और इसके साथ शुरू होने वाले तरीकों get…को आमतौर पर लिखने के लिए एक बफर पॉइंटर को पारित करने की उम्मीद की जाती है। substringFromIndex:एक मध्यवर्ती विकल्प बनाता है, जो कि अनावश्यक है, वही rangeOfString:options:range:है। माना जाता है कि सामान्य बग विधि में असुरक्षित स्निपेट को लपेटकर आप बग का सामना कर रहे हैं: यदि विभाजक स्ट्रिंग में एक या कम बार मौजूद है तो आपको रेंज अपवाद से बाहर निकल जाएगा।
रेगेक्सिडेंट

14

इसका भी उपयोग करें

NSString *ChkStr = [MyString substringWithRange:NSMakeRange(5, 26)];

नोट - आपका NSMakeRange(start, end)होना चाहिए NSMakeRange(start, end- start);


12

यहाँ उपसर्ग और प्रत्यय के बीच @Regexident विकल्प 1 और @Garett के उत्तर का एक छोटा संयोजन है, और अधिक और इसके साथ प्रत्यय के बीच एक शक्तिशाली स्ट्रिंग कटर पाने के लिए ... उस पर ANDMORE शब्द।

NSString *haystack = @"MOREvalue:hello World:valueANDMORE";
NSString *prefix = @"value:";
NSString *suffix = @":value";
NSRange prefixRange = [haystack rangeOfString:prefix];
NSRange suffixRange = [[haystack substringFromIndex:prefixRange.location+prefixRange.length] rangeOfString:suffix];
NSRange needleRange = NSMakeRange(prefixRange.location+prefix.length, suffixRange.location);
NSString *needle = [haystack substringWithRange:needleRange];
NSLog(@"needle: %@", needle);

अब यह काम करता है! मैंने Regixident के विकल्प 1 की कोशिश की, यह मेरे लिए काम नहीं करता था। मैं ऐसा क्यों नहीं सोच सकता। मैं <i></i>उन तार को इटैलिक बनाने के लिए अपनी परियोजना में टैग के अंदर एक स्ट्रिंग प्राप्त करने के लिए एक समाधान की तलाश कर रहा हूं । :)
ग्लेन पोसादास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.