#swift
Вопрос:
У меня есть строка «Очень хороший пляж», и я хочу иметь возможность увидеть, содержит ли она какие-либо слова подстроки в массиве групп слов.
let string = "A very nice beach" let wordGroups = [ "beach", "waterfront", "with a water view", "near ocean", "close to water" ]
Комментарии:
1. Итак, если
string
содержит «пляжи», то «пляж» — это «пляж» изwordGroups
совпадения?
Ответ №1:
Первое решение заключается в точном совпадении слова или фразы при wordGroups
использовании регулярного выражения
var isMatch = false for word in wordGroups { let regex = "\b(word)\b" if string.range(of: regex, options: .regularExpression) != nil { isMatch = true break } }
Как было предложено в комментариях, приведенный выше цикл можно заменить более короткой contains
версией
let isMatch = wordGroups.contains { string.range(of: "\b($0)\b", options: .regularExpression) != nil }
Второе решение-для простого текста, если string
он содержит любую из строк в массиве
let isMatch2 = wordGroups.contains(where: string.contains)
Таким образом, для «Очень хорошего пляжа» оба возвращают значение true, но для «Некоторых очень хороших пляжей» только второй возвращает значение true
Комментарии:
1. почему бы и нет
contains(where:)
вместоfirst(where:)
!= ноль2. На самом деле никакой особой причины не было,
first(where)
это было первое (да), что пришло на ум, но не нуждаться!= nil
, конечно, еще яснее. Спасибо.3. Вы все еще можете использовать
contains { ... }
в первом решении4. @Sulthan не уверен, что я понимаю, не сделает ли это то же самое, что и второе решение?
5. @JoakimDanielson Я думаю, что важной частью первого решения является использование регулярного выражения, а не итерация. Поэтому вы все еще можете использовать
wordGroups.contains { word in string.range(of: "\b(word)\b", options: .regularExpression) != nil }
Ответ №2:
Не был слишком уверен, как интерпретировать «чтобы увидеть, содержит ли он какие-либо слова подстроки в массиве групп слов», но это решение проверяет, содержатся ли какие-либо слова вашей входной строки в какой-либо подстроке ваших групп слов.
func containsWord(str: String, wordGroups: [String]) -gt; Bool { // Get all the words from your input string let words = str.split(separator: " ") for group in wordGroups { // Put all the words in the group into set to improve lookup time let set = Set(group.split(separator: " ")) for word in words { if set.contains(word) { return true } } } return false }