2016-12-08 10 views
2

У меня возникли проблемы с попыткой сопоставить символы CJK extension B в NSString.Матч CJK расширение B в Objective-C

Wikipédia CJK Unified Ideographs Extension B :

CJK Unified Идеограммы Extension B представляет собой блок Unicode, содержащий редкие и исторические CJK идеограммы для китайского, японского, корейского и вьетнамского .

ЮНИКОДу блок из персонажей: от U+20000 до U+2A6DF Я использую регулярное выражение: [\\ud840-\\ud868][\\udc00-\\udfff]|\\ud869[\\udc00-\\uded6], чтобы соответствовать CJK расширение символов B.

Вот мой код:

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       Матч символ со значением шестигранной hhhhhhhh. Должно быть предусмотрено восемь шестнадцатеричных цифр, хотя самая большая кодовая точка Юникода - \U0010ffff.

Таким образом, использование

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

См online Obj-C demo