2017-08-01 5 views
4

Ich möchte einen einfachen Algorithmus wissen, um festzustellen, ob eine Zeichenfolge exakten Satz oder Wort enthält.Swift 3 String enthält genaue Satz/Wort

Ich bin nicht auf der Suche für:

string.contains(anotherString)

Hier ist der Grund:

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

Im Beispiel oben, es ist wahr zurück, denn wenn "you" im "your" Wort finden. Ich möchte eine Methode, die in diesem Zustand falsch zurückgibt.

Zum Beispiel:

let string = "I am learning Swift" 

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

Verfahren contains(exact:) wird seit "learn" return false nicht gleich mit "learning"

Ein weiteres Beispiel:

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

Was den Algorithmus ist zu bekommen Das Ergebnis in Swift 3? Oder gibt es dafür eine vordefinierte Methode?

+0

Sie könnten durch die Wörter iterieren und sie mit '==' vergleichen. – LinusGeffarth

+0

@LinusGeffarth Ich dachte das auch, aber wir können nicht feststellen, ob es zwischen den Wörtern doppelten Abstand gibt und es nicht zusammenpassen sollte. –

+0

Dann sollten Sie das vorher behandeln. Ich bin mir nicht sicher, ob die integrierte Weißraum-Funktion dies tut. Wenn nicht, überprüfe einfach '' (zwei aufeinander folgende Leerzeichen) und lösche dann einen von ihnen. – LinusGeffarth

Antwort

3

Eine Lösung ist Regular Expression, die in der Lage ist, nach Wortgrenzen zu suchen.

Dies ist eine einfache String-Erweiterung, sucht das Muster für die String-Abfrage in Wortgrenzen eingewickelt (\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 
     } 
    } 
} 

Oder - dank Sulthan - noch einfacher

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

Verbrauch:

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

Ich habe Regex völlig vergessen. Dies funktioniert perfekt und kann auch mehrere Wörter zusammenbringen. –

+0

Findet dies ein Wort am Anfang (oder Ende) der Zeichenfolge? –

+1

Während dies richtig ist, brauchen Sie wirklich 'NSRegularExpression'? Würde nicht 'self.range (von:" \\ b \ (word) \\ b ", Optionen: .regularExpression)! = Nil' dasselbe tun? – Sulthan

2

Eine regexlose Lösung wäre so etwas wie:

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) 

Dies behandelt alle nicht alphanumerischen Zeichen als Wortgrenzen.

+0

Leider deckt das die Mehrwortabfrage nicht ab. – vadian

+0

@vadian Nein, das tut es nicht. Ich habe diese Anforderung verpasst. Mehrere Wörter regexless zu überprüfen, würde einige Array-Manipulation benötigen, denke ich ... – Sweeper