Как проверить, содержит ли строка подстроку в массиве строк в Swift?

#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 }