使用精确子字符串过滤字符串

Filter string by using exact substring

我需要根据搜索键从 CoreData 中搜索和获取对象。 我的核心数据对象包含一个名为 names 的字符串 属性。我的要求如下

managedObject1.names = "James,James Willson,Willson James,James Camaroon"
managedObject2.names = "James Willson,James,Willson James,James Camaroon"
managedObject3.names = "James Camaroon,James Willson,Willson James,James"
managedObject4.names = "James Willson,Willson James,James Camaroon"

当用户使用 'James' 搜索键时,我只需要 managedObject1、managedObject2 和 managedObject3。

我尝试了 NSPredicate(format: "names contains[d] %@", name) 但它也返回了 managedObject4。

这个谓词怎么写?

您可以使用具有正则表达式模式的谓词 匹配逗号括起来的名称:

let name = "James"
let pattern = "(.*,)?\(NSRegularExpression.escapedPattern(for: name))(,.*)?"
let predicate = NSPredicate(format: "name MATCHES %@", pattern)

(更好的模型是与 "Name" 实体建立 to-many 关系,而不是包含 comma-separated 名称的单个字符串。)

因此,如果我正确理解您的要求,您只想 return 那些以 James 为名字而没有任何名字或姓氏的对象?

在那种情况下你可以有这样的条件

let names = "James Willson,Willson James,James Camaroon"
let searchedString = "James"
let searchedStringCount = searchedString.characters.count

let endIndex = names.index(names.startIndex, offsetBy: searchedStringCount + 1)
let startIndex = names.index(names.endIndex, offsetBy: -(searchedStringCount + 1))

let startString = names.substring(to: endIndex) // prints "James "
let endString = names.substring(from: startIndex) // prints "maroon"

let shouldBeReturned = startString == "\(searchedString)," || endString == ",\(searchedString)" || names.contains(",\(searchedString),") // prints false

这样的条件考虑到名称可以在开头(前面没有逗号)或结尾(后面没有逗号)