ObjC

2010-10-23 14 views
15

में दो अन्य स्ट्रिंग्स के बीच स्ट्रिंग प्राप्त करें मैं एक स्ट्रिंग को पार्स करने और बीच में एक और स्ट्रिंग प्राप्त करने की कोशिश कर रहा हूं।ObjC

यानी।

नमस्ते दुनिया इस एक स्ट्रिंग

मैं "दुनिया" और के बीच स्ट्रिंग खोजने की जरूरत है (यह) "है।" मैंने चारों ओर देखा है लेकिन अभी तक इसे समझने में सक्षम नहीं है, मुख्य रूप से क्योंकि मैं उद्देश्य सी के लिए नया हूं ... किसी को भी यह पता है कि यह कैसे करें Regéx के साथ या बिना?

उत्तर

30

नियमित अभिव्यक्ति समाधान है कि जाक काम करता है देता है, और चेतावनी आईओएस 4.0 की आवश्यकता है और बाद में सच है। नियमित अभिव्यक्तियों का उपयोग करना भी काफी धीमा है, और यदि खोज अभिव्यक्ति स्ट्रिंग स्थिरांक ज्ञात हैं तो एक ओवरकिल।

आप NSString पर विधियों का उपयोग करके समस्या का समाधान कर सकते हैं, या NSScanner नाम की कक्षा, दोनों आईफोन ओएस 2.0 के बाद से उपलब्ध हैं और इससे पहले कि मैक ओएस एक्स 10.0 वास्तव में पहले से ही :)।

तो आप क्या चाहते हैं NSString पर यह एक नई विधि है?

@interface NSString (CWAddition) 
- (NSString*) stringBetweenString:(NSString*)start andString:(NSString*)end; 
@end 

कोई बात नहीं, और हम यह मान हम लौट जाना nil ऐसी कोई तार पाया जा सकता है है।

NSString का उपयोग कर कार्यान्वयन केवल काफी सीधे आगे है:

@implementation NSString (NSAddition) 
- (NSString*) stringBetweenString:(NSString*)start andString:(NSString*)end { 
    NSRange startRange = [self rangeOfString:start]; 
    if (startRange.location != NSNotFound) { 
     NSRange targetRange; 
     targetRange.location = startRange.location + startRange.length; 
     targetRange.length = [self length] - targetRange.location; 
     NSRange endRange = [self rangeOfString:end options:0 range:targetRange]; 
     if (endRange.location != NSNotFound) { 
      targetRange.length = endRange.location - targetRange.location; 
      return [self substringWithRange:targetRange]; 
     } 
    } 
    return nil; 
} 
@end 

या आप NSScanner वर्ग का उपयोग कर कार्यान्वयन कर सकता है:

@implementation NSString (NSAddition) 
- (NSString*) stringBetweenString:(NSString*)start andString:(NSString*)end { 
    NSScanner* scanner = [NSScanner scannerWithString:self]; 
    [scanner setCharactersToBeSkipped:nil]; 
    [scanner scanUpToString:start intoString:NULL]; 
    if ([scanner scanString:start intoString:NULL]) { 
     NSString* result = nil; 
     if ([scanner scanUpToString:end intoString:&result]) { 
      return result; 
     } 
    } 
    return nil; 
} 
@end 
+0

ध्यान दें कि यह समाधान यह सुनिश्चित नहीं करता है कि दुनिया और शब्द सीमाओं पर है। आप इससे निपटने के लिए और कोड जोड़ सकते हैं, लेकिन यह मुश्किल हो सकता है, इसलिए मैं सभी कोने के मामलों से निपटने में आसान बनाने के लिए नियमित अभिव्यक्तियों (या तो एनएसआरग्यूलर एक्स्प्रेशन या आईओएस 3 के लिए रेगेक्सकिटलाइट) का उपयोग करने का सुझाव दूंगा। यह देखने के लिए कुछ प्रोफाइलिंग करें कि आपको समाधान को कोड-कोड करने की आवश्यकता है या नहीं। – Jacques

+0

धन्यवाद! मुझे स्ट्रिंग्स को भी कई बार मिलना होगा ... यानी। हैलो अलविदा मुझे लगता है कि मैं केवल एक और पैरामीटर (घटना) में जोड़ सकता हूं और फिर शुरुआती स्ट्रिंग एक्स बार के माध्यम से लूप कर सकता हूं, है ना? मुझे इसे समझने में सक्षम होना चाहिए, खासकर जब से आपने मुझे एनएसआरेंज का प्रारंभिक बिंदु दिया, आदि। धन्यवाद फिर से! –

+0

हां, कोई समस्या नहीं होनी चाहिए। अगली खोज की खोज सीमा को सीमित करने के लिए बस पिछली खोज से श्रेणियों का उपयोग करें। – PeyloW

3

ICU user guide on regular expressions देखें।

आप जानते हैं कि सिर्फ एक परिणाम हो जाएगा, तो सुनिश्चित करें कि दुनिया के सामने एक शब्द सीमा नहीं है

NSRegularExpression *regex = [NSRegularExpression 
    regularExpressionWithPattern:@"\bworld\s+(.+)\s+is\b" options:0 error:NULL] 

NSTextCheckingResult *result = [regex firstMatchInString:string 
    options:0 range:NSMakeRange(0, [string length]]; 

// Gets the string inside the first set of parentheses in the regex 
NSString *inside = [string substringWithRange:[result rangeAtIndex:1]]; 

\ b बनाता है और है के बाद (ताकि wouldn "हैलो दुनिया यह नहीं एक स्ट्रिंग है" ' टी मैच)। दुनिया के पहले और पहले के बाद किसी भी सफेद जगह को गोबल्स करता है। द +? आप जो खोज रहे हैं उसे पाता है? इसे गैर लालची बनाते हैं ताकि "हैलो वर्ल्ड यह एक स्ट्रिंग हैलो वर्ल्ड है, यह एक स्ट्रिंग है" आपको यह "यह स्ट्रिंग हैलो वर्ल्ड" नहीं देती है।

एकाधिक मैचों को संभालने के तरीके को समझने के लिए मैं इसे आपके पास छोड़ दूंगा। NSRegularExpression दस्तावेज़ आपको मदद करनी चाहिए।

यदि आप यह सुनिश्चित करना चाहते हैं कि मैच वाक्य सीमाओं को पार नहीं करता है, तो आप (। +?) के बजाय ([^।] +?) कर सकते हैं, या आप enumerateSubstringsInRange का उपयोग कर सकते हैं: विकल्प: ब्लैक का उपयोग करके: अपने विकल्पों में स्ट्रिंग और पास NSStringEnumerationBySentences।

इस सामग्री को सभी को 4.0+ की आवश्यकता है। यदि आप 3.0+ का समर्थन करना चाहते हैं, तो RegexKitLite में देखें।

+0

सहायता के लिए धन्यवाद! मुझे ओएस 3/आईपैड का समर्थन करने की आवश्यकता होगी, इसलिए यह वर्तमान में एक विकल्प नहीं है। एक बार ओएस 4 आईपैड के लिए बाहर आ जाता है तो मैं Regex का उपयोग कर इस कार्यान्वयन पर स्विच कर सकता हूं। –

1

यह सिर्फ सफेद रिक्त स्थान आप निम्नलिखित कोड का उपयोग कर सकते से अलग तार किया जाना होता है: या तो

[string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] 

या

NSMutableArray *parts = [NSMutableArray arrayWithCapacity:1]; 

NSScanner *scanner = [NSScanner scannerWithString:string]; 
NSString *token; 
while ([scanner scanUpToCharactersFromSet:[NSCharacterSet whitespaceCharacterSet]] intoString:&token]) { 
    [parts addObject:token]; 
} 
12

PeyloW के जवाब देने के लिए बस एक साधारण संशोधन, वह सब देता है शुरुआत और अंत तारों के तार:

-(NSMutableArray*)stringsBetweenString:(NSString*)start andString:(NSString*)end 
{ 

    NSMutableArray* strings = [NSMutableArray arrayWithCapacity:0]; 

    NSRange startRange = [self rangeOfString:start]; 

    for(;;) 
    { 

    if (startRange.location != NSNotFound) 
    { 

     NSRange targetRange; 

     targetRange.location = startRange.location + startRange.length; 
     targetRange.length = [self length] - targetRange.location; 

     NSRange endRange = [self rangeOfString:end options:0 range:targetRange]; 

     if (endRange.location != NSNotFound) 
     { 

     targetRange.length = endRange.location - targetRange.location; 
     [strings addObject:[self substringWithRange:targetRange]]; 

     NSRange restOfString; 

     restOfString.location = endRange.location + endRange.length; 
     restOfString.length = [self length] - restOfString.location; 

     startRange = [self rangeOfString:start options:0 range:restOfString]; 

     } 
     else 
     { 
     break; 
     } 

    } 
    else 
    { 
     break; 
    } 

    } 

    return strings; 

} 
+0

+1 यही वह है जिसे मैं ढूंढ रहा था। धन्यवाद दोस्त!! –

+2

दूसरों के लिए .. एक और पैरामीटर 'मूल स्ट्रिंग' के रूप में जोड़ें और इसके साथ 'स्वयं' को प्रतिस्थापित करें। –

संबंधित मुद्दे

 संबंधित मुद्दे