2013-11-04 1 views
1

html에서 일부 이름을 추출하려고합니다. 예를 들어, 문자열은 다음과 같이 보일 수 있습니다 : 내가 사용 w와 일치하는 비 영어 문자

Doe, J 

패턴은 다음과 같습니다

\w+, \w 

다 한 이름이 영어 알파벳의 문자 구성으로 잘 작동합니다. 동일한 패턴이 스페인어 또는 폴란드어 이름과 일치하지 않습니다.

Cortázar, J 
Król, S 

분명히 특정 문자에 문제가 있습니다. \ w와 (과) 일치하는 모든 아이디어는이 문자와 일치합니까? 내가 NSRegularExpression options을 들여다 보았지만 지원하지 않는다. 아니면 여기에 요점을 놓친 것일까? 똑똑한 정규 표현식을 제시해야합니까?

답변

0

NSRegularExpression은 좋은 방법으로 유니 코드 문자와 일치하지 않는 것 같습니다. 대신 내가 가진 것으로 간주되는 구분 기호까지 모두 일치시킬 수 있습니까?

^(\X+?),$ 

이렇게하면 원하는 결과가있는 캡처 그룹이 만들어지고 유니 코드와도 일치해야합니다.

일치하는 문자 식 \u 또는 \p을 사용할 수도 있습니다. 이것은 here으로 볼 수 있습니다. 이 article에 설명되어 있습니다.

+0

NSRegularExpression이 \ X를 유니 코드 버전의 도트 (.)로 사용할 수 있기 때문에 당신이 링크 한 기사에서 실제로 적절한 해결책을 찾았습니다. 욕심을 느끼지 않게 만듭니다. – lawicko

+0

그래, 그 대답을 반영하도록 답변을 변경했습니다. –

+0

반대로 NSRegularExpression은 유니 코드 문자와 잘 어울리는 것으로 보입니다. 적어도 시도한 문자와 일치합니다. 한 가지 예를 들어 내 대답을 볼 수 있습니다. 또는, 더 나은 방법은 스스로 시도해보십시오 :-) 한 가지주의해야 할 점이 있습니다 :'\ b'는 비 ASCII 문자로 단어 경계를 탐지하기 위해'(? w :)'와 같이'w' 플래그를 필요로합니다. 자세한 내용은 여기 : http://userguide.icu-project.org/strings/regexp – Monolo

1

\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"문자열과 일치하지 않습니다.

+0

이것이 내 질문과 관련이 있는지, NSRegularExpression과 이름을 일치시키기 위해 할 수있는 일이 있는지 잘 모르겠습니다. ? – lawicko

+0

@lawicko 질문과 관련하여 많은 부분이 있습니다. 조건부 엔진은 컨셉을 빨리 증명할 수 있도록 코드를 작성하는 단순한 방법 일뿐입니다.형식 문자열에 문학적 정규식 패턴을 사용하지 않도록 예제를 다시 작성 했으므로 이제 두 예제를 직접 비교할 수 있습니다. 어쨌든, 대답을 편집하여 NSRegularExpression으로 끝난 예제를 추가하십시오. 작동한다는 것을 보여주기 위해 더 많은 코드가 필요합니다. – Monolo

+0

이것은 마법이어야합니다 :) 나는 어제 마술처럼 작동하려고했던 것과 동일한 성냥을했습니다. 왜 그런지 모르겠군요. 설명을 주셔서 감사합니다. 어차피 더 이상 어차피 \ w를 사용하지 않습니다. 왜냐하면 내 데이터 가끔 나타납니다. 복합 이름을 사용하므로 더 일반적인 일치를 사용하여 필터링합니다. 어쨌든, \ w는 결국 유니 코드 문자와 일치하며 NSPredicate가 동일한 정규식 엔진을 밑으로 사용한다는 것을 알기 쉽습니다. – lawicko

관련 문제