2012-10-26 34 views
5

Tôi khá xanh ở regex với Objective-C. Tôi gặp khó khăn với nó.NSRegularExpressions mục tiêu-C, tìm sự xuất hiện đầu tiên của các số trong một chuỗi

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

Tất cả tôi đang tìm cách để làm là lấy một chuỗi như

150A 

Và nhận

150 

Trả lời

7

Đầu tiên là vấn đề với regex:

  1. Bạn đang sử dụng ranh giới từ (\b) có nghĩa là bạn chỉ tìm kiếm một con số đó là do bản thân (ví dụ 15 nhưng không 150A).
  2. Phạm vi số của bạn không bao gồm 0 để nó không thể chụp 150. Cần phải là [0-9]+ và tốt hơn là sử dụng \d+.

Vì vậy, để khắc phục điều này, nếu bạn muốn chụp bất kỳ số nào bạn cần là \d+. Nếu bạn muốn chụp bất kỳ thứ gì bắt đầu bằng một số thì chỉ đặt ranh giới từ vào đầu \b\d+.

Bây giờ để có được sự xuất hiện đầu tiên, bạn có thể sử dụng
-[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

Rất hoàn hảo. Cảm ơn bạn! – rnystrom

0

gì về .*?(\d+).*??

Demo: Điều đó sẽ phản ánh số lượng và bạn sẽ có thể sử dụng nó ở bất cứ đâu bạn muốn.

+0

Xin lỗi, điều này không làm việc như '*' hiện một * dài * trận đấu, như vậy với đầu vào '150A' là người đầu tiên '. * 'khớp' 15', '(\ d +)' khớp với '0', và'. * 'cuối cùng khớp với' A'. – CRD

+0

Xin lỗi, tôi quên ký hiệu "lười biếng" –

+0

Có, * kết quả phù hợp * ngắn nhất sẽ làm điều đó, nhưng bạn chỉ cần một người đầu tiên chắc chắn? (Và tất nhiên có những người khác cũng sẽ làm điều đó, tuy nhiên một mẫu như @ Joe chỉ phù hợp với số lượng yêu cầu tốt.) – CRD

Các vấn đề liên quan