\w
의 문제점 중 하나는 적절하게 이스케이프 처리 된 모든 역 슬래시를 사용하여 문자열로 가져와야한다는 것입니다.
NSArray *names = @[@"Cortázar, J", @"Król, S", @"Don't Match This", @"Doe, J", @"Høegh, K"];
NSString *pattern = @"\\w+, \\w";
NSPredicate *pred = [NSPredicate predicateWithFormat: @"self MATCHES %@", pattern];
NSArray* result = [names filteredArrayUsingPredicate: pred];
그것은 제대로 2.
이 술어 엔진이 같은 정규 표현식 구문을 사용하기 때문에 당신이 NSRegularExpression
로 문자열을 일치시킬 수 있음을 보여주고 이름을 일치하지만 인덱스에있는 "잘못"문자열을 잎 .
편집 추가 :
// The names and pattern variables taken from code above
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
options:NSRegularExpressionCaseInsensitive
error:&error];
for (NSString *string in names) {
NSRange rangeOfFirstMatch = [regex rangeOfFirstMatchInString:string options:0 range:NSMakeRange(0, [string length])];
if (!NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0))) {
NSString *result = [string substringWithRange:rangeOfFirstMatch];
NSLog(@"Match: '%@'", result);
}
else {
NSLog(@"No match: '%@'", string);
}
}
당신은 그것을 이름과 일치하는 것을 볼 수 있습니다 : 당신이 직접 NSRegularExpression
를 사용하여 주장하는 경우
, 당신은 조금 더 많은 코드 작업을 볼 수 있습니다 순수 ASCII 또는 다양한 유럽 악센트 부호가있는 문자가 있지만 "Do not Match This"문자열과 일치하지 않습니다.
NSRegularExpression이 \ X를 유니 코드 버전의 도트 (.)로 사용할 수 있기 때문에 당신이 링크 한 기사에서 실제로 적절한 해결책을 찾았습니다. 욕심을 느끼지 않게 만듭니다. – lawicko
그래, 그 대답을 반영하도록 답변을 변경했습니다. –
반대로 NSRegularExpression은 유니 코드 문자와 잘 어울리는 것으로 보입니다. 적어도 시도한 문자와 일치합니다. 한 가지 예를 들어 내 대답을 볼 수 있습니다. 또는, 더 나은 방법은 스스로 시도해보십시오 :-) 한 가지주의해야 할 점이 있습니다 :'\ b'는 비 ASCII 문자로 단어 경계를 탐지하기 위해'(? w :)'와 같이'w' 플래그를 필요로합니다. 자세한 내용은 여기 : http://userguide.icu-project.org/strings/regexp – Monolo