在Objective-C中匹配CJK扩展B.

时间:2016-12-08 09:25:03

标签: objective-c regex unicode cjk

我在尝试匹配NSString中的CJK扩展B字符时遇到了问题。

Wikipédia CJK Unified Ideographs Extension B :

  

CJK Unified Ideographs Extension B是一个包含稀有的Unicode块   中国,日本,韩国和中国的历史性CJK表意文字   越南。

字符的unicode块是:从U+20000U+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

例如,如果我为平假名字符尝试更简单的事情,那么它正在起作用:

NSString *searchedString = @"ひ";

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

输出:matches

非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用\Uxxxxxxxx表示法匹配BMP平面之外的那些Unicode字符。

度Acc。到ICU regex docs

  

\Uhhhhhhhh将字符与十六进制值hhhhhhhh匹配。即使最大的Unicode代码点为\U0010ffff,也必须提供恰好八位十六进制数字。

所以,使用

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

请参阅online Obj-C demo