Swift 3 String包含精确句子/单词

时间:2017-08-01 11:53:32

标签: swift

我想知道一个简单的算法来确定字符串是否包含精确的句子或单词。

我不是在寻找:

string.contains(anotherString)

原因如下:

let string = "I know your name"
string.contains("you") // Will return true

在上面的示例中,它返回true,因为如果在单词"you"中找到"your"。我想要一个在这种情况下会返回false的方法。

例如:

let string = "I am learning Swift"

// Let's say we make a method using extension called contains(exact:)
string.contains(exact: "learn") // return false

方法contains(exact:)将返回false,因为"learn"不等于"learning"

另一个例子:

let string = "Healthy low carb diets"
string.contains(exact: "low carb diet") // return false

在Swift 3中获得该结果的算法是什么?或者是否有预定义的方法?

3 个答案:

答案 0 :(得分:10)

解决方案是正则表达式,它能够检查字边界。

这是一个简单的String扩展,该模式搜索包含在单词边界(\b

中的查询字符串
extension String {
    func contains(word : String) -> Bool
    {
        do {
            let regex = try NSRegularExpression(pattern: "\\b\(word)\\b")
            return regex.numberOfMatches(in: self, range: NSRange(word.startIndex..., in: word)) > 0
        } catch {
            return false
        }
    }
}

或者 - 感谢Sulthan - 仍然更简单

extension String {
    func contains(word : String) -> Bool
    {
        return self.range(of: "\\b\(word)\\b", options: .regularExpression) != nil
    }
}

用法:

let string = "I know your name"
string.contains(word:"your") // true
string.contains(word:"you") // false

答案 1 :(得分:2)

无正则解决方案将是:

yourString.components(separatedBy: CharacterSet.alphanumerics.inverted)
    .filter { $0 != "" } // this is here os that it always evaluates to false if wordToFind is "". Feel free to remove this line if you don't need it.
    .contains(wordToFind)

这会将每个非字母数字字符视为字边界。

答案 2 :(得分:0)

func containsExact(_ findString: String, _ inString: String) -> Bool {
    let expression = "\\b\(findString)\\b"
    return inString.range(of: expression, options: .regularExpression) != nil
}