2012-05-20 1 views
2

문자열 "Hello World"가있는 경우 NSRegularExpression을 패턴 "@ World"와 함께 사용하여 즉, "Hello World"예제에서 일치 항목의 위치/색인은 "6"이어야합니다.objective-c에서 문자열 내에서 정규 표현식 일치의 위치를 ​​얻는 것이 가능합니다.

(PHP에서)이 작업을 수행하려면 "PREG_OFFSET_CAPTURE"플래그와 함께 preg_match을 사용하고 싶습니다. 객관적인 -c가이를 지원합니까?

답변

3

보는 것이 좋습니다

NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:@"world" options:0 error:NULL]; 
// omitted error checking for the sake of simplicity 
NSString *str = @"Hello world!"; 
[regex enumerateMatchesInString:str 
    options:0 
    range:NSMakeRange(0, str.length) 
    usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) 
    { 
     NSLog(@"Match at [%d, %d]", result.range.location, result.range.length); 
    }]; 
[regex release]; 

또는 POSIX 방법 (이있을 수 있습니다 당신이 단지 하나의 일치를 원하기 때문에이 함수/메소드는 일치 범위를 직접 반환합니다.

#include <regex.h> 

- (NSRange)matchString:(NSString *)string toRegex:(NSString *)regex 
{ 
    regex_t regex_obj; 
    regmatch_t match; 
    const char *regex_str; 
    const char *match_str; 
    int error; 

    regex_str = [regex UTF8String]; 
    error = regcomp(&regex_obj, regex_str, REG_EXTENDED); 
    if (error) 
    { 
     return NSMakeRange(NSNotFound, 0); 
    } 

    match_str = [string UTF8String]; 
    error = regexec(&regex_obj, match_str, 1, &match, 0); 
    if (error) 
    { 
     return NSMakeRange(NSNotFound, 0); 
    } 

    regfree(&regex_obj); 
    return NSMakeRange(match.rm_so, match.rm_eo - match.rm_so); 
} 
0

예 가능합니다. NSRegularExpression 메서드 인 rangeOfFirstMatchInString : options : range :를 사용하면 첫 번째 일치 범위를 반환합니다. REGEX를 사용할 필요가없는 경우 NSString 메서드 인 rangeOfString을 사용하여이 작업을 수행 할 수도 있습니다.

1

이것은 코코아에 다소 긴하지만, 당신이 그것을 할 수 있습니다

NSError *error = NULL; 
NSRegularExpression *regex = [NSRegularExpression 
    regularExpressionWithPattern:@"world" 
    options:NSRegularExpressionSearch 
    error:&error]; 
NSString *str = @"Hello, world!"; 
NSTextCheckingResult *match = [regex firstMatchInString:str 
    options:0 
    range:NSMakeRange(0, [str length])]; 
if (match) { 
    NSRange matchRange = [match range]; 
    NSLog(@"%lu", matchRange.location); 
} 

7를 인쇄합니다. 당신이 정규식의 사용을 많이 만들려고하는 경우

1

, 나는 당신이 그것을 코코아 방법으로 할 수 RegexKit or RegexKitLite.

+0

코코아는 기본적으로 정규 표현식을 지원합니다 (심지어 rec iOS 버전) –

+0

@ H2CO3 전혀 쓸모가 없습니다. NSString에 대한 정규식 확장과 같은 멋진 기능이있는 멋진 프레임 워크입니다. – wadesworld