弦が2本ある
val string1 = "Hello"
val string2 = "Hello world"
Kotlin
のstring1
のstring2
からの各文字の存在を数える必要があります
これまでのところ、私はこれだけのコードを書いて、正規表現にこだわっています
val string1_array = string1.toCharArray()
val pattern = Regex("") // Regex pattern here
val matcher = string2
val count = pattern.findAll(matcher).count()
CharArrayを検索するための適切な正規表現パターンは何ですか?コトリンで行うより良い方法はありますか
以下の高次の方法を使用できます。
val count = string2.count{ string1.contains(it) }
print(count)
7を印刷します
最初の文字列の文字をマップキーとして使用できます。次に例を示します。
val string1 = "Hello"
val string2 = "Hello world"
val chars = HashMap<Character, Int>()
for (char in string1) // fill keys
chars[char] = 0
for (char in string2) // count occurrences
chars[char]?.let {
chars[char] = it + 1
}
実際の質問に答えるには:最も単純な正規表現パターンは、文字クラス構文"[" + string1 + "]"
を使用することです。注意してください、これは常にうまく動作するとは限りません。すべてのASCiiの文字と数字に適しています。 \^-?!
などの特殊文字は適切にエスケープする必要があります。ルールについては https://www.regular-expressions.info/charclass.html を参照してください
fun main(args: Array<String>): Unit {
val string1 = "Hello"
val string2 = "Hello world Hello"
val string1_array = string1.toCharArray()
val pattern = Regex("[" + string1 + "]") // Regex pattern here
val matcher = string2
val count = pattern.findAll(matcher).count()
print(count)
}
タスクの解決方法:このタスクを実行する最良の方法は、代わりにfilter
またはcount
を使用することです正規表現。特別な構文を使用する必要がないためです。
fun main(args: Array<String>): Unit {
val string1 = "Hello"
val string2 = "Hello world Hello"
//returns all chars of string2 contained in string1 as list
val count = string2.filter { string1.contains(it) }.length
//an other a bit shorter solution with count
count = string2.count{ string1.contains(it) }
print(count)
}