如何在 NSPredicate 中重现 MATCHES 以查询 Realm?

How to reproduce MATCHES in NSPredicate to query Realm?

我有一个使用 NSPredicate 的查询,它采用正则表达式并匹配路径:

let predicate = NSPredicate(format: "path MATCHES '/test/([^/]*[^/])$'")

匹配文件夹 test 中的所有内容,但排除 test 中文件夹的所有子文件夹,如下所示:

  1. /test/abc ->
  2. /test/abc/def ->

问题是,我无法在 Realm.io 中使用 NSPredicateMATCH 关键字。我怎样才能重现这个查询以便它在 Realm 中工作?

为完整性添加例外:

*** Terminating app due to uncaught exception 'Invalid operator type', reason: 'Operator type 6 not supported for string type'

这里是来自 Realm 的 Joe。当前 MATCH 的 Realm 查询不支持正则表达式,您需要手动执行此操作。我会构建一个 NSArray 并在其上使用过滤器谓词。我们知道这一点并跟踪所有不受支持的谓词 here

所以现在我已经解决了这样的问题(修改模型,我想避免):

  1. 我只存储父级的路径,而不是完整的路径和名称。名称存储在不同的字段中(为了获得完整路径,我将两个字符串拼接在一起)
  2. 我使用 NSPredicate(format: "path ==[c] %@", "/test/") 来获取文件夹 test.
  3. 的内容,而不是匹配正则表达式

为什么我对这个解决方案不是很满意:

我想避免将字段 fullPath 分成两个字段,因为当文件被重命名+移动时,它只是一个操作 - 重写 fullPath 在数据库中。这似乎是一个小问题,但只有一个地方负责使它更加健壮,因为文件一直在应用程序环境中移动和重命名。