我正在尝试使用自由文本字符串在数组中搜索项目。到目前为止,见下面的代码,但我仍然返回只部分匹配的结果。

var townArray = ["Leamington Spa", "Birmingham", "Coventry", "Leamington Hastings", "Royal Leamington Spa", "Lea", "Leam", "Cove"]

let searchText = "Anyone want to meet in Leamington Spa or Coventry"

var resultsArray = [String]()

for i in townArray {
    let range = searchText.lowercased().range(of: i.lowercased(), options: .regularExpression)
    // (8 times)
    if range != nil {
    let found = searchText.substring(with: range!)
    print(found)
    resultsArray.append(found)
    // (5 times)}
}
print(resultsArray)
// ["Leamington Spa", "Coventry", "Lea", "Leam", "Cove"]

最佳答案

精确的单词匹配不是一件简单的事情,您可能需要使用正则表达式。
例如:

var townArray = ["Leamington Spa", "Birmingham", "Coventry", "Leamington Hastings", "Royal Leamington Spa", "Lea", "Leam", "Cove"]

let searchText = "Anyone want to meet in Leamington Spa or Coventry"

let townRegexArray = townArray.map {townName -> (name: String, regex: NSRegularExpression) in
    let pattern = townName.components(separatedBy: " ")
        .map{"\\b"+NSRegularExpression.escapedPattern(for: $0)+"\\b"}
        .joined(separator: "\\s+")
    //print(pattern) //->\bLeamington\b\s+\bSpa\b (=="\\bLeamington\\b\\s+\\bSpa\\b")...
    let regex = try! NSRegularExpression(pattern: pattern, options: .caseInsensitive)
    return (name: townName, regex: regex)
}
let resultsArray = townRegexArray
    .filter{$0.regex.firstMatch(in: searchText, range: NSRange(0..<searchText.utf16.count)) != nil}
    .map{$0.name}
print(resultsArray) //->["Leamington Spa", "Coventry"]

\b(字符串文本中的"\\b")表示regex中的单词边界。因此\bLeam\bLeamington不匹配。

关于arrays - 根据数组中的值在字符串中搜索完全匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41241342/

10-12 12:19
查看更多