使用带有ISBN编号的NSPredicate示例混淆正则表达式

时间:2014-01-09 09:14:51

标签: ios iphone regex nspredicate

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

2 个答案:

答案 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]