ios - 在NSPredicate和ISBN数字示例中使用正则表达式感到困惑

标签 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

最佳答案

  • 数字的正则表达式模式为\d
  • 在谓词'…'中的文字字符串内,每个反斜杠都必须转义,因此您得到\\d
  • 谓词是在文字NSString中定义的,因此必须再次转义反斜杠,并且您会得到\\\\d

  • 如果在谓词中使用%@格式而不是文字字符串,则可以避免一个转义步骤:
    NSString *pattern = @"\\d{10}|\\d{9}[Xx]";
    NSPredicate *isbnPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
    

    通常,对谓词中的所有可变部分使用%@会更好,因为它可以避免
    各种报价和转义问题。

    关于ios - 在NSPredicate和ISBN数字示例中使用正则表达式感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21015930/

    相关文章:

    ios - 如何在显示 View 时屏蔽 ViewController

    iphone - 具有用于渲染和游戏逻辑的独立计时器的游戏循环

    python - 将正则表达式模式转换为小写

    ios - 如何使用 InAppSettingsKit 委托(delegate)重新配置已更改的应用程序设置

    一对多的 iOS Core 数据谓词

    iOS推送通知-如何指定通知声音

    iphone - iOS 中如何使用套接字?

    javascript - 用于验证具有固定范围的十进制数的正则表达式

    regex - 从末尾开始连续两个大写字母

    ios - Xcode 6.4 只显示只运行 iPhone 6 模拟器