Проверьте, содержит ли строка что-либо из массива строк (kotlin) - PullRequest
0 голосов
/ 11 июня 2018

Я новичок в Kotlin (у меня есть опыт работы с Java), и я не могу понять, как проверить, содержит ли строка совпадение из списка ключевых слов.

Что я хочуdo проверяет, содержит ли строка совпадение из массива ключевых слов (без учета регистра) .Если это так, распечатайте ключевое слово (слова), которое соответствует, и строку, содержащую ключевое слово.(Я буду перебирать кучу строк в файле).

Вот MVE для начинающих:

val keywords = arrayOf("foo", "bar", "spam")

fun search(content: String) {
    var match = <return an array of the keywords that content contained>
    if(match.size > 0) {
          println("Found match(es): " + match + "\n" + content)
    }
}   

fun main(args: Array<String>) {
    var str = "I found food in the barn"
    search(str) //should print out that foo and bar were a match
}

В качестве начала (это игнорирует переменную 'match' и получаетa-list-of-Keywords-Matched), я попытался использовать следующее выражение if в соответствии с тем, что я нашел в этот вопрос ,

if(Arrays.stream(keywords).parallel().anyMatch(content::contains))

, но он поставил волнистую строку под "content "и дал мне эту ошибку

Ни одна из следующих функций не может быть вызвана с предоставленными аргументами: public operator fun CharSequence.contains (char: Char, ignoreCase: Boolean = ...): Booleanопределенный в kotlin.text открытый оператор fun CharSequence.contains (other: CharSequence, ignoreCase: Boolean = ...): логическое значение, определенное в kotlin.text @InlineOnly открытый встроенный оператор fun CharSequence.contains (regex: Regex): логическое значение, определенное в kotlin.text

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Другим очевидным выбором является использование регулярного выражения для сопоставления без учета регистра:

arrayOf("foo", "bar", "spam").joinToString(prefix = "(?i)", separator = "|").toRegex())

Склеивает шаблон с префиксным встроенным (?i) чувствительным к регистру модификатором и чередует ключевые слова: (?i)foo|bar|spam

Пример кода :

private val keywords = arrayOf("foo", "bar", "spam")
private val pattern = keywords.joinToString(prefix = "(?i)", separator = "|")
private val rx = pattern.toRegex()

fun findKeyword(content: String): ArrayList<String> { 
    var result = ArrayList<String>()
    rx.findAll(content).forEach { result.add(it.value) }
    return result
}

fun main(args: Array<String>) { 
    println(findKeyword("Some spam and a lot of bar"));
}

Подход с использованием регулярных выражений может быть полезен, если вы хотите выполнить более сложное сопоставление, например, сопоставления без совпадения или с добавлением границ слов \b и т. д.

0 голосов
/ 11 июня 2018

Вы можете использовать функцию filter, чтобы оставить только те ключевые слова, которые содержатся в content:

val match = keywords.filter { it in content }

Здесь match - это List<String>.Если вы хотите получить массив в результате, вы можете добавить .toTypedArray() call.

in оператор в выражении it in content совпадает с content.contains(it).

Еслиесли вы хотите, чтобы совпадение не учитывало регистр, вам нужно указать параметр ignoreCase при вызове contains:

val match = keywords.filter { content.contains(it, ignoreCase = true) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...