【问题标题】:Swift 3 String Contains Exact Sentence / WordSwift 3 字符串包含确切的句子/单词
【发布时间】:2018-01-08 06:40:43
【问题描述】:

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

我不是在寻找:

string.contains(anotherString)

原因如下:

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

在上面的示例中,它返回 true,因为如果在单词 "your" 中找到 "you"。我想要一个在这种情况下返回 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 中获得该结果的算法是什么?或者有预定义的方法吗?

【问题讨论】:

  • 您可以遍历单词并使用==进行比较。
  • @LinusGeffarth 我也想过,但我们无法确定单词之间是否有双空格,它不应该匹配。
  • 那你应该先处理它。我不确定内置的修剪空白功能是否可以做到。如果没有,只需检查 ` (两个后续空格),然后删除其中一个。

标签: swift


【解决方案1】:

一个解决方案是能够检查单词边界的正则表达式。

这是一个简单的字符串扩展,该模式搜索包含在单词边界中的查询字符串 (\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

【讨论】:

  • 我完全忘记了正则表达式。这很好用,也可以匹配多个单词。
  • 这是否在字符串的开头(或结尾)找到了一个单词?
  • 虽然这是正确的,但你真的需要NSRegularExpression吗? self.range(of: "\\b\(word)\\b", options: .regularExpression) != nil 不会做同样的事情吗?
  • 另外,您可能必须转义 word,以确保没有危险字符。
  • @MartinR 是的,确实如此
【解决方案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)

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

【讨论】:

  • 不幸的是,这不包括多词查询。
  • @vadian 不,这不是。我错过了这个要求。无规则地检查多个单词需要一些数组操作,我猜......
【解决方案3】:
func containsExact(_ findString: String, _ inString: String) -> Bool {
    let expression = "\\b\(findString)\\b"
    return inString.range(of: expression, options: .regularExpression) != nil
}

【讨论】:

    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多