1. 概要

このクイックチュートリアルでは、StringをKotlinの一連の要素に分割するいくつかの方法を理解します。

2. 区切り文字で分割

String を1つの区切り文字だけで分割するには、 split(delimiter:String)拡張関数を使用できます。

val info = "Name,Year,Location"
assertThat(info.split(",")).containsExactly("Name", "Year", "Location")

ここで、 split()関数は、指定されたStringをコンマ区切り文字で期待どおりに分割します。 非常に興味深いことに、複数の区切り文字を同じ関数に渡すこともできます。

val info = "Name,Year,Location/Time"
assertThat(info.split(",", "/")).containsExactly("Name", "Year", "Location", "Time")

上記の例では、区切り文字としてコンマ文字とスラッシュ文字を同時に使用しています。 分割パーツの数を制限することも可能です

val info = "Name,Year,Location/Time/Date"
assertThat(info.split(",", limit = 2)).containsExactly("Name", "Year,Location/Time/Date")
assertThat(info.split(",", "/", limit = 4)).containsExactly("Name", "Year", "Location", "Time/Date")

limit引数がたとえば2の場合、返されるリストには最大で2つの要素が含まれます。

さらに、大文字と小文字を区別しない方法で区切り文字を分割することができます

val info = "127.0.0.1aaFirefoxAA58"
assertThat(info.split("aa", ignoreCase = true)).containsExactly("127.0.0.1", "Firefox", "58")

split()関数に加えて、特別な lines()拡張関数を使用して、新しい行を区切り文字として分割できます。

val info = "First line\nsecond line\rthird"
assertThat(info.lines()).containsExactly("First line", "second line", "third")

lines()関数は、区切り文字として\ n、\ r、および\ r\nの3文字または文字シーケンスを使用します。

2.1. レイジースプリット

split()拡張関数のすべてのバリエーションは、リストを返します —熱心に評価されたパーツのコレクション 。 単純ではなくスプリット() 、あります splitToSequence() を返すバリエーション順序 これは怠惰に評価されたコレクションです:

val info = "random_text,".repeat(1000)
assertThat(info.splitToSequence(",").first()).isEqualTo("random_text")

ここで、 splitToSequence()は、1,000個の要素を持つコレクションを作成しません。 代わりに、ある種のイテレータを返すため、各部分の計算は、要求されるまで延期されます。 上記の例では、最初の分割部分のみが計算されます。

他のシーケンスと同じように、返された操作に対して一連の操作を実行すると、 順序 、各ステップの終了時に中間結果は得られません。 これは、特に分割パーツと操作の数が非常に多い場合に、潜在的に有益です。

3. 正規表現で分割

リテラル文字に加えて、区切り文字として正規表現を使用することもできます。 例えば:

val info = "28 + 32 * 2 / 64 = 29"
val regex = "\\D+".toRegex()
assertThat(info.split(regex)).containsExactly("28", "32", "2", "64", "29")

上記の例では、区切り文字として数字以外の任意のシーケンスを使用しています。 同様に、Javaのパターンを正規表現として渡すこともできます。

val pattern = Pattern.compile("\\D+")
assertThat(info.split(pattern)).containsExactly("28", "32", "2", "64", "29")

パーツの数を制限することも可能です。

assertThat(info.split(regex, 3)).containsExactly("28", "32", "2 / 64 = 29")
assertThat(info.split(pattern, 3)).containsExactly("28", "32", "2 / 64 = 29")

4. 結論

この短いチュートリアルでは、リテラル文字と正規表現を区切り文字として使用して、Kotlin Stringを分割する方法を説明しました。 さらに、分割された部分を怠惰な方法で計算することも学びました。

いつものように、すべての例はGitHubから入手できます。