我想知道一个简单的算法来确定字符串是否包含精确的句子或单词。
我不是在寻找:
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中获得该结果的算法是什么?或者是否有预定义的方法?
答案 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
}