【问题标题】:Match CJK extension B in Objective-C在 Objective-C 中匹配 CJK 扩展 B
【发布时间】:2017-04-23 11:35:19
【问题描述】:

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

Wikipédia CJK Unified Ideographs Extension B :

CJK 统一表意文字扩展 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

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 您的模式无效。非捕获组语法为(?:...)。此外,末尾的 g 代表文字字母 g - 是有意的吗?
  • 是否有可能因为值在UTF-16 而不是UTF-8 而无法正常工作?
  • @WiktorStribiżew 抱歉,我在格式化消息时不小心删除了 (?:.. 部分。为了更简单,我更新了我的问题
  • 使用\UXXXXXXX 表示法怎么样?试试NSString *pattern = @"[\\U00020000-\\U0002A6DF]+";
  • @WiktorStribiżew 非常感谢,它有效!

标签: objective-c regex unicode cjk


【解决方案1】:

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

累加。致ICU regex docs

\Uhhhhhhhh     匹配具有十六进制值 hhhhhhhh 的字符。即使最大的 Unicode 代码点是 \U0010ffff,也必须提供正好 8 个十六进制数字。

所以,使用

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

online Obj-C demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多