2017-08-01 43 views
4

我想知道一個簡單的算法來確定一個字符串是否包含精確的句子或單詞。Swift 3 String Contains Exact Sentence/Word

我不是在尋找:

string.contains(anotherString)

這裏的原因:

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

在上面的例子中,因爲如果找到的話"your""you"返回true。我想要一個在那種情況下會返回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 

的方法,因爲"learn"contains(exact:)將返回false不符合"learning"

又如等於:

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

什麼是算法得到那導致Swift 3?或者是有這種預定義的方法?

+0

您可以迭代單詞並使用'=='比較它們。 – LinusGeffarth

+0

@LinusGeffarth我認爲這也是一個問題,但我們無法確定單詞之間是否有雙重空格,而且它不應該匹配。 –

+0

然後你應該處理它。我不確定內置修剪白色空間功能是否可以。如果不是,只需檢查「(後續兩個空格),然後刪除其中的一個。 – LinusGeffarth

回答

3

解決方案是正則表達式,它能夠檢查單詞邊界。

這是一個簡單的字符串擴展,圖案搜索包裹在單詞邊界的查詢字符串(\b

extension String { 
    func contains(word : String) -> Bool 
    { 
     do { 
      let regex = try NSRegularExpression(pattern: "\\b\(word)\\b") 
      return regex.numberOfMatches(in: self, range: NSRange(location: 0, length: self.utf16.count)) > 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 
+0

我完全忘了正則表達式。這工作完美,也可以匹配多個單詞。 –

+0

這是否在字符串的開頭(或結尾)找到一個單詞? –

+1

雖然這是正確的,你真的需要'NSRegularExpression'嗎?不會'self.range(of:「\\ b \(word)\\ b」,options:.regularExpression)!= nil'也一樣嗎? – Sulthan

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) 

這會將每個非字母數字字符視爲字邊界。

+0

不幸的是,不涵蓋多字查詢。 – vadian

+0

@vadian不,這沒有。我錯過了這個要求。無限制地檢查多個單詞需要一些數組操作,我猜... – Sweeper