Swift 3 String Contains Exact Sentence / Word

2020-03-19 03:53发布

I would like to know a simple algorithm to determine if a string contains exact sentence or word.

I'm not looking for:

string.contains(anotherString)

Here's why:

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

In the example above, it returns true because if find "you" in the word "your". I want a method that will return false in that condition.

For example:

let string = "I am learning Swift"

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

The method contains(exact:) will return false since "learn" is not equal with "learning"

Another example:

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

What's the algorithm to get that result in Swift 3? Or is there predefined method for this?

标签: swift
3条回答
家丑人穷心不美
2楼-- · 2020-03-19 03:59

A regexless solution would be something like:

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)

This will treat every non-alphanumeric character as a word boundary.

查看更多
Juvenile、少年°
3楼-- · 2020-03-19 04:03

A solution is Regular Expression which is able to check for word boundaries.

This is a simple String extension, the pattern searches for the query string wrapped in word boundaries (\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
        }
    }
}

Or – thanks to Sulthan – still simpler

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

Usage:

let string = "I know your name"
string.contains(word:"your") // true
string.contains(word:"you") // false
查看更多
对你真心纯属浪费
4楼-- · 2020-03-19 04:05
func containsExact(_ findString: String, _ inString: String) -> Bool {
    let expression = "\\b\(findString)\\b"
    return inString.range(of: expression, options: .regularExpression) != nil
}
查看更多
登录 后发表回答