Test if string contains anything from an array of strings (kotlin) Test if string contains anything from an array of strings (kotlin) arrays arrays

Test if string contains anything from an array of strings (kotlin)


You can use the filter function to leave only those keywords contained in content:

val match = keywords.filter { it in content }

Here match is a List<String>. If you want to get an array in the result, you can add .toTypedArray() call.

in operator in the expression it in content is the same as content.contains(it).

If you want to have case insensitive match, you need to specify ignoreCase parameter when calling contains:

val match = keywords.filter { content.contains(it, ignoreCase = true) }


Another obvious choice is using a regex doing case-insensitive matching:

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

Glues together a pattern with a prefixed inline (?i) incase-sensitive modifier, and alternations between the keywords: (?i)foo|bar|spam

Sample Code:

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"));}

The regex approach could be handy if you are after some more complex matching, e.g. non-/overlapping matches adding word boundaries \b, etc.


Here is my approach without Streams:

fun String.containsAnyOfIgnoreCase(keywords: List<String>): Boolean {    for (keyword in keywords) {        if (this.contains(keyword, true)) return true    }    return false}

Usage:

"test string".containsAnyOfIgnoreCase(listOf("abc","test"))