2016-12-08 8 views
2

NSString에서 CJK 확장 B 문자와 일치하는 데 문제가 있습니다. Objective-C의 CJK 확장 B와 일치

표의 확장 B 통합 Wikipédia CJK Unified Ideographs Extension B :

CJK

중국어, 일본어, 한국어, 베트남어 레어 역사적인 CJK 표의 문자를 포함하는 유니 블록이다.

문자의 유니 코드 블록은 다음과 같습니다 CJK 확장 B 문자를 일치 [\\ud840-\\ud868][\\udc00-\\udfff]|\\ud869[\\udc00-\\uded6] : 나는 정규식을 사용하고 U+20000 U+2A6DF까지. 여기

내 코드입니다 :

NSString *searchedString = @""; // First character (U+20000) 

NSString *pattern = @"[\\ud840-\\ud868][\\udc00-\\udfff]|\\ud869[\\udc00-\\uded6]"; 

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil]; 
if ([regex numberOfMatchesInString:searchedString options:0 range:NSMakeRange(0, [searchedString length])] > 0) { 
    NSLog(@"matches"); 
} else { 
    NSLog(@"doesn't match"); 
} 

출력 : doesn't match exemple 들어

나는 히라가나 문자를 더 간단하게 뭔가를하려고하면, 그것은 노력하고 있습니다 :

NSString *searchedString = @"ひ"; 

NSString *pattern = @"[\\u3040-\\u309F]"; 

출력 : matches

도움을 주시면 감사하겠습니다. 감사.

+0

귀하의 패턴이 올바르지 않은 사용을 참조하십시오. 비 캡처 그룹 구문은'(? : ...)'입니다. 또한 끝에있는 'g'는 문자 그대로 'g'를 의미합니다 - 의도 된 것입니까? –

+0

값이 'UTF-16'이고 'UTF-8'이 아니기 때문에 작동하지 않을 수 있습니까? –

+0

@ WiktorStribiżew 죄송합니다. 실수로 내 메시지의 서식을 지울 때 (? : .. 부분을 지 웁니다. 간단하게하기 위해 질문을 업데이트했습니다. –

답변

2

\Uxxxxxxxx 표기법을 사용하여 BMP 평면 외부의 유니 코드 문자를 일치시킬 수 있습니다.

Acc. ICU regex docs에 :

\Uhhhhhhhh       매치 16 진수 값 hhhhhhhh와 문자. 가장 큰 유니 코드 코드 포인트가 \U0010ffff이더라도 정확하게 8 자리 16 진수를 제공해야합니다.

그래서,

NSString *pattern = @"[\\U00020000-\\U0002A6DF]+"; 

online Obj-C demo