2012-10-26 12 views
5

में संख्याओं की पहली घटना को ढूंढना मैं उद्देश्य-सी के साथ regex पर बहुत हरा हूं। मुझे इसके साथ कुछ परेशानी हो रही है।उद्देश्य-सी NSRegularExpressions, स्ट्रिंग

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\b([1-9]+)\\b" options:NSRegularExpressionCaseInsensitive error:&regError]; 
if (regError) { 
    NSLog(@"%@",regError.localizedDescription); 
} 
__block NSString *foundModel = nil; 
[regex enumerateMatchesInString:self.model options:kNilOptions range:NSMakeRange(0, [self.model length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop) { 
    foundModel = [self.model substringWithRange:[match rangeAtIndex:0]]; 
    *stop = YES; 
}]; 

सभी मुझे क्या करना देख रहा हूँ की तरह

150A 

एक स्ट्रिंग ले और

150 

उत्तर

7

पहले regex के साथ समस्याओं:

शब्द सीमाओं
  1. आप उपयोग कर रहे हैं (\b) जिसका मतलब है कि आप केवल एक संख्या है कि अपने आप में है (उदाहरण के लिए 15 नहीं बल्कि 150A) के लिए देख रहे हैं।
  2. आपकी संख्या सीमा में 0 शामिल नहीं है, इसलिए यह 150 पर कब्जा नहीं करेगा। इसे [0-9]+ होना चाहिए और बेहतर अभी तक \d+ का उपयोग करें।

तो इसे ठीक करने के लिए, यदि आप किसी भी संख्या को कैप्चर करना चाहते हैं तो आपको \d+ की आवश्यकता है। यदि आप किसी भी संख्या से शुरू होने वाली किसी भी चीज़ को कैप्चर करना चाहते हैं तो केवल \b\d+ पर शब्द सीमा को केवल रखें।

अब पाने के लिए पहली घटना आप उपयोग कर सकते
-[regex rangeOfFirstMatchInString:options:range:]

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\b\\d+" options:NSRegularExpressionCaseInsensitive error:&regError]; 
if (regError) { 
    NSLog(@"%@",regError.localizedDescription); 
} 

NSString *model = @"150A"; 
NSString *foundModel = nil; 
NSRange range = [regex rangeOfFirstMatchInString:model options:kNilOptions range:NSMakeRange(0, [model length])]; 
if(range.location != NSNotFound) 
{ 
    foundModel = [model substringWithRange:range]; 
} 

NSLog(@"Model: %@", foundModel); 
+0

इतना सही है। धन्यवाद! – rnystrom

0

क्या .*?(\d+).*? के बारे में मिलता है?

Demo: यह संख्या को पीछे हटाना होगा और आप जहां भी चाहें इसका उपयोग कर सकेंगे।

+0

क्षमा करें, यह के रूप में काम नहीं करता है '*' करता है एक * सबसे लंबे समय तक * मैच है, तो इनपुट '150A' पहले' साथ। * '' 15 'से मेल खाता है, '(\ d +)' मैचों '0', और अंतिम'। * 'मैचों' ए'। – CRD

+0

क्षमा करें, मैं "आलसी" चिह्न –

+0

हां भूल जाता हूं हां, * सबसे छोटा * मैच यह करेगा, लेकिन आपको केवल पहले की आवश्यकता है? (और निश्चित रूप से अन्य री हैं जो यह भी करेंगे, हालांकि @ जो के मैचों जैसे पैटर्न केवल आवश्यक संख्या है जो अच्छी है।) – CRD