2011-08-25 10 views
7

मेरे पास एक खोज स्ट्रिंग है, जहां लोग समूह वाक्यांशों को एक साथ उद्धरण का उपयोग कर सकते हैं और इसे अलग-अलग कीवर्ड के साथ मिश्रित कर सकते हैं। उदाहरण के लिए, इस तरह एक स्ट्रिंग:NSArray में NSString को अलग करना, लेकिन समूह शब्दों को उद्धृत करने की अनुमति

"Something amazing" rooster 

मैं अलग करने के लिए है कि एक NSArray में, इतना है कि यह Something amazing (उद्धरण के बिना) के लिए होता है एक तत्व है, और rooster अन्य के रूप में के रूप में चाहते हैं।

न तो componentsSeparatedByString और न ही componentsSeparatedByCharactersInSet बिल फिट करने लगते हैं। क्या ऐसा करने का कोई आसान तरीका है, या क्या मुझे इसे स्वयं कोड करना चाहिए?

+0

आप NSRegularExpression के साथ कुछ भाग्य हो सकता है, एक विश्वसनीय नियमित के साथ आ हालांकि इस कार्य के लिए लार अभिव्यक्ति असंभव हो सकती है। :-) एक और दृष्टिकोण केवल अंतरिक्ष (@ "") पर विभाजित होने के लिए हो सकता है, फिर प्रत्येक शब्द को उन शब्दों की तलाश करें जो उद्धरण के साथ शुरू या समाप्त होते हैं और उन्हें एक वाक्यांश में जोड़ते हैं। –

उत्तर

1

मैं नियमित रूप से अभिव्यक्ति के साथ जा रहा था क्योंकि मैं पहले से ही RegexKitLite का उपयोग कर रहा था, और इस एनएसएसटींग + सर्च एक्स्टेंशन श्रेणी बना रहा था।

ज:

// NSString+SearchExtensions.h 
#import <Foundation/Foundation.h> 
@interface NSString (SearchExtensions) 
-(NSArray *)searchParts; 
@end 

मीटर:

// NSString+SearchExtensions.m 
#import "NSString+SearchExtensions.h" 
#import "RegexKitLite.h" 

@implementation NSString (SearchExtensions) 

-(NSArray *)searchParts { 
    __block NSMutableArray *items = [[NSMutableArray alloc] initWithCapacity:5]; 

    [self enumerateStringsMatchedByRegex:@"\\w+|\"[\\w\\s]*\"" usingBlock: ^(NSInteger captureCount, 
     NSString * const capturedStrings[captureCount], 
     const NSRange capturedRanges[captureCount], 
     volatile BOOL * const stop) { 

     NSString *result = [capturedStrings[0] stringByReplacingOccurrencesOfRegex:@"\"" withString:@""]; 

     NSLog(@"Match: '%@'", result); 
     [items addObject:result]; 
    }];   
    return [items autorelease]; 
} 
@end 

यह तलाश किए जाने के साथ तार के एक NSArray देता है, दोहरे उद्धरण चिह्नों कि वाक्यांशों के चारों ओर दूर करने।

+0

धन्यवाद, टिम। सरल, और एक आकर्षण की तरह काम करता है। आपको नए आईओएस संस्करणों के लिए 'autorelease' चीज़ को छोड़ना होगा, लेकिन यह वास्तव में अच्छा है। और _we_ अन्य टिम द्वारा "DIY" उत्तर से अधिक उपयोगी है :) – mgarciaisaia

2

आपको शायद इसे स्वयं कुछ कोड करना होगा, लेकिन एनएसएसकेनर को निर्माण करने के लिए एक अच्छा आधार होना चाहिए। यदि आप शब्दों को चुनने के लिए अपने अगले व्हाइटस्पेस या उद्धरण चरित्र तक सब कुछ देखने के लिए scanUpToCharactersInSet विधि का उपयोग करते हैं। एक बार जब आप एक काफी चरित्र का सामना कर लेते हैं, तो आप चरित्र सेट में केवल उद्धरण का उपयोग करके स्कैन करना जारी रख सकते हैं, ताकि उद्धरणों के भीतर की जगहों का परिणाम टोकन के अंत में न हो।

+0

यदि इस उत्तर से उदास महसूस हो रहा है, तो ओपी के उत्तर [यहां] (http://stackoverflow.com/a/7379286/641451) को एक समाधान समाधान के साथ देखें। – mgarciaisaia

0

मैं -componentsSeparatedByString:@"\"" पहले चल पाएंगे, तो एक BOOL isPartOfQuote, हाँ करने के लिए प्रारंभ बनाते हैं स्ट्रिंग के प्रथम वर्ण एक ", लेकिन अन्यथा नहीं करने के लिए सेट था

फिर वापस जाने के लिए एक अस्थायी सरणी बनाने के लिए:। NSMutableArray* masterArray = [[NSMutableArray alloc] init]; अधिक सरणी जुदाई से लौटे

फिर, एक पाश बनाने के लिए:।

for(NSString* substring in firstSplitArray) { 
    NSArray* secondSplit; 
    if (isPartOfQuote == NO) { 
     secondSplit = [substring componentsSeparatedByString:@" "]; 
    } 
    else { 
     secondSplit = [NSArray arrayWithObject: substring]; 
    } 

    [masterArray addObjectsFromArray: secondSplit]; 
    isPartOfQuote = !isPartOfQuote; 
} 

तब समारोह से masterArray लौट

1

यदि आप थोड़ा अलग दृष्टिकोण की अनुमति देंगे, तो आप Dave DeLong's CHCSVParser आज़मा सकते हैं। इसका उद्देश्य सीएसवी तारों को पार्स करना है, लेकिन यदि आप स्पेस कैरेक्टर को डिलीमीटर के रूप में सेट करते हैं, तो मुझे पूरा यकीन है कि आपको इच्छित व्यवहार मिल जाएगा।

वैकल्पिक रूप से, आप कोड में देख सकते हैं और देख सकते हैं कि यह उद्धृत फ़ील्ड को कैसे प्रबंधित करता है - यह एमआईटी लाइसेंस के तहत प्रकाशित होता है।

+3

+1 स्पष्ट कारणों से –

+0

@ डेवडेलॉन्ग, मुझे "स्पष्ट कारण" ढूंढने में थोड़ी देर लग गई: पी –

1

मैं इस NSScanner का उपयोग कर ऐसा करने के लिए एक आसान तरीका बनाया:

+ (NSArray *)arrayFromTagString:(NSString *)string { 

NSScanner *scanner = [NSScanner scannerWithString:string]; 
NSString *substring; 
NSMutableArray *array = [[NSMutableArray alloc] init]; 

while (scanner.scanLocation < string.length) { 

    // test if the first character is a quote 
    unichar character = [string characterAtIndex:scanner.scanLocation]; 
    if (character == '"') { 
     // skip the first quote and scan everything up to the next quote into a substring 
     [scanner setScanLocation:(scanner.scanLocation + 1)]; 
     [scanner scanUpToString:@"\"" intoString:&substring]; 
     [scanner setScanLocation:(scanner.scanLocation + 1)]; // skip the second quote too 
    } 
    else { 
     // scan everything up to the next space into the substring 
     [scanner scanUpToString:@" " intoString:&substring]; 
    } 
    // add the substring to the array 
    [array addObject:substring]; 

    //if not at the end, skip the space character before continuing the loop 
    if (scanner.scanLocation < string.length) [scanner setScanLocation:(scanner.scanLocation + 1)]; 
} 
return array.copy; 

}

यह विधि एक टैग स्ट्रिंग के लिए वापस सरणी में परिवर्तित कर देंगे, फिर से हवाले से बहु-शब्द टैग:

+ (NSString *)tagStringFromArray:(NSArray *)array { 

NSMutableString *string = [[NSMutableString alloc] init]; 
NSRange range; 

for (NSString *substring in array) { 
    if (string.length > 0) { 
     [string appendString:@" "]; 
    } 
    range = [substring rangeOfString:@" "]; 
    if (range.location != NSNotFound) { 
     [string appendFormat:@"\"%@\"", substring]; 
    } 
    else [string appendString:substring]; 
} 
return string.description; 

}

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