【发布时间】:2017-04-23 11:35:19
【问题描述】:
我在尝试匹配 NSString 中的 CJK 扩展 B 字符时遇到问题。
Wikipédia CJK Unified Ideographs Extension B :
CJK 统一表意文字扩展 B 是一个 Unicode 块,包含罕见的 和历史悠久的 CJK 表意文字,用于中文、日文、韩文和 越南语。
字符的unicode块是:从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
例如,如果我为平假名字符尝试更简单的方法,它会起作用:
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