2012-10-26 21 views
5

Objective-C ile düzenli olarak yeşil renkteyim. Onunla biraz zorlanıyorum.Objective-C NSRegularExpressions, bir dizgede sayıların ilk oluşumunu bulmak için

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

ben vermek istiyorum Tüm

150A 

gibi bir dize almak Ve

150 

cevap

7

ilk regex ile ilgili sorunlar:

  1. kullanıyorsunuz sözcük sınırları sadece kendisi tarafından bir dizi (örneğin 15 değil 150A) Aradığınız demektir (\b).
  2. Numara aralığınız 0'u içermez, bu nedenle 150 yakalanmaz. [0-9]+ olmalı ve daha iyisi \d+ kullanın.

Bunu düzeltmek için, ihtiyacınız olan herhangi bir sayıyı yakalamak isterseniz, \d+. Bir sayı ile başlayan bir şeyi yakalamak istiyorsanız, o zaman sadece \b\d+ başındaki kelime sınırını koyun.

Şimdi ilk geçtiği Eğer
-[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

Mükemmel. Teşekkür ederim! – rnystrom

0

Ne .*?(\d+).*? hakkında olsun?

Demo: Bu numaraya geri döner ve istediğiniz yerde kullanabilirsiniz.

+0

Maalesef kullanabilirsiniz almak için, bu gibi çalışmıyor '*' yapan bir * uzun * maç, girdi '' 150A' ilk öylesine. * '' 15'le eşleşir, '(\ d +)' '0' ile eşleşir ve final'. * '' A' ile eşleşir. – CRD

+0

Özür dileriz, "tembel" tabelasını unuttum –

+0

Evet, * en kısa * maç yapacak, ama sadece ilkine mutlaka ihtiyacın var mı? (Ve tabii ki de bunu yapacak diğer re'ler var, ancak @ Joe gibi bir desen sadece iyi olan gereken numarayla eşleşiyor.) – CRD

İlgili konular