有没有办法检查字符串是否包含Unicode字母?

时间:2016-05-23 08:35:50

标签: ios objective-c regex string unicode

在Cocoa中,正则表达式可能遵循ICU Unicode规则进行字符匹配,ICU标准包括\p{L}等字符属性,用于匹配各种Unicode字母。然而

NSString* str = @"A";
NSPredicate* pred = [NSPredicate predicateWithFormat:@"SELF MATCHES '\\p{L}'"];
NSLog(@"%d", [pred evaluateWithObject:str]);

似乎没有编译:

Can't do regex matching, reason: Can't open pattern U_REGEX_BAD_INTERVAL (string A, pattern p{L}, case 0, canon 0)

如果不支持字符属性(是吗?),我还可以在iOS应用中检查字符串是否包含Unicode字母吗?

1 个答案:

答案 0 :(得分:2)

这里的要点是MATCHES需要完整的字符串匹配,并且传递给正则表达式引擎的\反斜杠应该是 literal 反斜杠。

正则表达式可以是

(?s).*\p{L}.*

这意味着:

  • (?s) - 启用DOTALL模式
  • .* - 匹配0个或更多任何字符
  • \p{L} - 匹配Unicode字母
  • .* - 匹配零个或多个字符。

在iOS中,只需加倍反斜杠:

NSPredicate * predicat = [NSPredicate predicateWithFormat:@"SELF MATCHES '(?s).*\\p{L}.*'"];

请参阅IDEONE demo

如果专门处理NSPrediciate内的反斜杠,请使用:

NSPredicate * predicat = [NSPredicate predicateWithFormat:@"SELF MATCHES '(?s).*\\\\p{L}.*'"];