【问题标题】:Using regex in NSPredicate to perform a NSFetchRequest在 NSPredicate 中使用正则表达式来执行 NSFetchRequest
【发布时间】:2025-12-27 03:05:07
【问题描述】:

我尝试用这个NSPredicate 执行NSFetchRequest

let searchString: NSString = "приш[её]л"
let predicate = NSPredicate(format: "text MATCHES[cd] %@", searchString)
let fetchRequest = NSFetchRequest(entityName: "Data")
fetchRequest.predicate = predicate

do {
    let objects = try context!.executeFetchRequest(fetchRequest) as! [NSManagedObject]
    return objects
} catch {
    print("Error")
}

但没有结果,虽然实际上“文本”包含“пришёл”

【问题讨论】:

    标签: ios regex swift core-data


    【解决方案1】:

    我在这个问题中找到了答案:Setting up a CoreData regular expression predicate for a comma-separated list

    let searchString = "приш[её]л"
    let format = "(text MATCHES %@)"
    let pattern = NSString(format: ".*(\\b%@\\b).*", searchString)
    let predicate = NSPredicate(format: format, pattern)
    

    【讨论】:

      【解决方案2】:

      您需要注意,如果您的数据库中有大量数据,则使用MATCHES[cd] 执行正则表达式(正则表达式)匹配非常昂贵。

      如果可以的话,你应该尽量避免使用正则表达式。在这种特殊情况下,使用规范化文本似乎可以让您使用%K BEGINWITH[n] %@%K ==[n] %@ 形式的谓词,速度非常快。

      要使用规范化字符串,您需要同时拥有属性 text 和它的规范化版本,例如textNormalized 可以在 text 的设置器中更新。然后,您将在 [n] 谓词中使用 textNormalized

      您可以使用规范化文本

      extension String {
          public var normalizedForSearch: String {
              let transformed = applyingTransform(
                  StringTransform("Any-Latin; Latin-ASCII; Lower"),
                  reverse: false)
              return transformed as String? ?? ""
          }
      }
      

      请务必查看我们书中关于文本的章节:https://www.objc.io/books/core-data/ — 它描述了如何使用文本的规范化版本来确保此类搜索有效。

      【讨论】:

      • ObjC.io 有最好的关于 CoreData 的书,但你认为这回答了 * 中的问题吗?
      • ObjC.io 有最好的关于 CoreData 的书,但你认为这回答了 * 中的问题吗?