2012-10-26 3 views
5

저는 Objective-C와의 정규식에서 매우 초록색입니다. 나는 그것에 어려움을 겪고있다.Objective-C 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

먼저에게 정규식에 대한 문제 :

  1. 당신이 사용하는 단어 경계 만 자체로 나타내는 숫자 (예를 들어, 15 아니라 150A)을 찾고 의미 (\b).
  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'에, 마지막'. *'은'A'에 일치합니다. – CRD

+0

죄송합니다. "게으른"기호를 잊어 버렸습니다 –

+0

예, * 최단 * 일치가되지만 처음 단 하나만 필요합니까? (물론 @ Joe와 같은 패턴은 좋은 숫자와 일치합니다.) – CRD