web-dev-qa-db-ja.com

文字列に文字列の配列からの何かが含まれているかどうかをテストする(kotlin)

私はKotlinを使い始めたばかりです(Java背景)があり、文字列に一致するキーワードが含まれているかどうかをキーワードのリストから確認する方法がわかりません。

私がしたいことは、文字列にキーワードの配列からの一致が含まれているかどうかをチェックすることです(大文字と小文字を区別しないでください)。その場合は、一致したキーワードとそのキーワードを含む文字列を出力します。 (ファイル内の一連の文字列をループします)。

初心者向けの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'変数を無視し、get-a-list-of-keywords-matchedを無視します)、私は this question で見つけたものに従って次のifステートメントを使用してみました

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

しかし、「コンテンツ」の下に波線が表示され、このエラーが発生しました

引数を指定して次の関数を呼び出すことはできません。public operator fun CharSequence.contains(char:Char、ignoreCase:Boolean = ...):kotlin.textで定義されたブールpublic operator fun CharSequence.contains(other:CharSequence、 ignoreCase:Boolean = ...):kotlin.textで定義されたブール@InlineOnlyパブリックインライン演算子fun CharSequence.contains(regex:Regex):kotlin.textで定義されたブール

12
takanuva15

filter 関数を使用して、contentに含まれるキーワードのみを残すことができます。

_val match = keywords.filter { it in content }
_

ここでmatchは_List<String>_です。結果の配列を取得したい場合は、.toTypedArray()呼び出しを追加できます。

式_it in content_のin演算子は、content.contains(it)と同じです。

大文字と小文字を区別しない一致が必要な場合は、ignoreCaseを呼び出すときにcontainsパラメータを指定する必要があります。

_val match = keywords.filter { content.contains(it, ignoreCase = true) }
_
12
Ilya

別の明白な選択は、大文字と小文字を区別しないマッチングを行う正規表現を使用することです:

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を追加するなど、非/重複の一致.

3
wp78de