私は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で定義されたブール
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) }
_
別の明白な選択は、大文字と小文字を区別しないマッチングを行う正規表現を使用することです:
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
を追加するなど、非/重複の一致.