Apple文档在描述如何在NSPredicate中使用正则表达式时提供了一个示例。
NSArray *isbnTestArray = @[@"123456789X", @"987654321x", @"1234567890", @"12345X", @"1234567890X"];
NSPredicate *isbnPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES '\\\\d{10}|\\\\d{9}[Xx]'"];
NSArray *isbnArray = [isbnTestArray filteredArrayUsingPredicate:isbnPredicate];
我的问题是为什么它使用\\\\d
而不是\\d
或\d
?
答案 0 :(得分:3)
\d
。'…'
中的文字字符串中,每个反斜杠都必须进行转义,因此您获得\\d
。NSString
中定义的,因此反斜杠必须再次转义,然后获得\\\\d
。如果在谓词中使用%@
格式而不是文字字符串,则可以避免一个转义步骤:
NSString *pattern = @"\\d{10}|\\d{9}[Xx]";
NSPredicate *isbnPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
对谓词中的所有变量部分使用%@
通常更好,因为它避免了
各种引用和逃避问题。
答案 1 :(得分:1)
大多数编程语言都使用\
来表示转义序列。
当你这样写:
SELF MATCHES '\\\\d{10}|\\\\d{9}[Xx]'
每个\将逃脱下一个角色,它将成为:
SELF MATCHES '\\d{10}|\\d{9}[Xx]'
为什么不使用?
如果使用like:
SELF MATCHES '\d{10}|\d{9}[Xx]'
在正则表达式中它将被更改为:
SELF MATCHES 'd{10}|d{9}[Xx]'
为什么不使用?
如果使用like:
SELF MATCHES '\\d{10}|\\d{9}[Xx]'
在正则表达式中它将被更改为:
SELF MATCHES '\d{10}|\d{9}[Xx]'
但在正则表达式中,\d
将被视为转义序列,并将其视为d{10}|d{9}[Xx]