在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字母吗?
答案 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}.*'"];