2012-10-26 12 views
5

Sono abbastanza verde all'espressione regolare con Objective-C. Sto avendo qualche difficoltà con questo.Objective-C NSRegularExpressions, trovando la prima occorrenza di numeri in una stringa

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; 
}]; 

Tutto quello che sto cercando di fare è prendere una stringa come

150A 

E ottenere

150 

risposta

7

Prima i problemi con l'espressione regolare:

  1. Stai utilizzando confini di parola (\b), che significa che si sta solo alla ricerca di un numero che è di per sé (per esempio 15 ma non 150A).
  2. L'intervallo di numeri non include 0 in modo da non acquisire 150. Deve essere [0-9]+ e meglio ancora usare \d+.

Quindi per risolvere questo problema, se si desidera acquisire qualsiasi numero tutto ciò che serve è \d+. Se vuoi catturare qualcosa che inizia con un numero, metti solo il confine della parola all'inizio \b\d+.

ora per ottenere la prima occorrenza è possibile utilizzare
-[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

Così perfetto. Grazie! – rnystrom

0

Che dire .*?(\d+).*??

Demo: Quello vorrebbe backreference il numero e si sarebbe in grado di utilizzarlo dove si desidera.

+0

spiace, ma questo non funziona come '*' fa un * lungo * match, quindi con l'ingresso '150A' il primo'. * 'corrisponde a' 15', '(\ d +)' corrisponde a '0', e il finale'. * 'corrisponde a' A'. – CRD

+0

Scusa, ho dimenticato il segno "pigro" –

+0

Sì, * la corrispondenza più breve * lo farà, ma hai solo bisogno del primo sicuramente? (E naturalmente ci sono altri re che lo faranno anche se un pattern come @ Joe's corrisponde solo al numero richiesto che è buono.) – CRD