2012-07-07 3 views
2

오늘 Objective-C를 사용해 보았지만 이상한 행동을합니다. 기본적으로 NSString에서 알파벳이 아닌 모든 소문자를 대체하려고했습니다. 내가 기본적으로 끓인 내용은 다음과 같습니다.[NSRegularExpression stringByReplacingMatchesInString]에 의한 예기치 않은 동작

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 
    NSError *error; 
    NSRegularExpression *pattern = [[NSRegularExpression alloc] initWithPattern:@"/[^abcdefghijklmnopqrstuvwxyz]/" options:0 error:&error]; 
    NSString *replacableStuff = @"a b c\nd e"; 
    NSLog(@"%@", [pattern stringByReplacingMatchesInString:replacableStuff options:0 range:NSMakeRange(0, [replacableStuff length]) withTemplate:@""]); 

    } 
    return 0; 
} 

그러나 교체는 결코 일어나지 않을 것입니다. 이 로그를 실행하면 "a b c \ nd e"가 로그에 기록됩니다. (나는 "abcde"를 볼 것으로 예상했다.) /[aeiou]/ 또는 심지어 /a/과 같은 간단한 패턴을 시도했지만, 내가 시도한 것에 상관없이 stringByReplacingMatchesInString 메서드는 실제로 아무것도 대체하지 않는 것처럼 보였다. 나는 무엇을 간과하고 있는가?

답변

2

패턴 양쪽에 슬래시를 제거해야합니다. 슬래시는 코코아의 정규 표현식에서 메타 문자가 아니므로 현재 표현식과 일치하는 문자열은 양쪽에 슬래시가있는 단일 문자 (/a/, /b/, /c/ 등)가됩니다.

당신은 또한이 같은 캐릭터 클래스의 범위를 사용할 수 있습니다

NSRegularExpression *pattern = [[NSRegularExpression alloc] initWithPattern:@"[^a-z]" options:0 error:&error]; 
+0

아하! 그거였다. 물론, 지금은 내가 보았던 모든 예들에서 더 일찍 눈치 채지 못했던 것 같은 기분이 든다. 감사! 범위 물건에 관해서는, 나는 [이 사이트에서] (http://stackoverflow.com/questions/1930487/will-az-ever-match-accented-characters-in-preg-pcre), 실제로 - 그 것을 배웠습니다. 문자 범위는 PHP의 PCRE 라이브러리에서 시스템 로케일에 따라 다른 문자와 일치 할 수 있으므로 모호한 부분이있을 때 문자를 쓰는 습관을 갖게되었습니다. 이것은 NSRegularExpression으로 걱정할 필요가없는 것입니까? –

+1

@ GarrettAlbright 범위가 인코딩에 종속된다는 것은 좋은 지적입니다. 그러나 Objective C 프로그램이 실행되는 환경 (Mac 및 iOS 장치)에서는 라틴 알파벳 문자가 연속 블록으로 배열되지 않은 비 정통 인코딩을 사용할 가능성이 없습니다. – dasblinkenlight