[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
「文字列の先頭の文字を取得したい」「末尾n文字を切り落としたい」なんてことありますよね。
しかし「どのように処理すればいいかな、、、」と迷っている人がほとんどだと思います。
この記事では、部分文字列を取得するためにあらかじめ用意されている、Scalaのたくさんの便利メソッドをご紹介します。
10種のメソッドを理解する
文字列の先頭や末尾の文字を処理するメソッドは、全部で10種類あります。
- 先頭から / 末尾から
- 1文字を / n文字を
- 取得する / 除去する
という、2パターン × 2パターン × 2パターン で8種類あります。
また、特殊な場合に先頭or末尾の1文字を取得するメソッドとして2種類あり、これらを合わせて10種類です。
早速ですが、早見表を掲載します。
あれこれと文字で説明すると逆に分かりづらいかもしれないのですが、表を見れば手っ取り早く全体像を捉えることができるでしょう。
〜を取得する | 〜以外を取得する | |
---|---|---|
先頭1文字 | head / headOption | tail |
末尾1文字 | last / lastOption | init |
先頭n文字 | take(n) | drop(n) |
末尾n文字 | takeRight(n) | dropRight(n) |
◯◯を〜〜するには「 」メソッド、という具合に読んでください。
メソッドを覚える順番
もちろんいろいろな覚え方があるので、自分に合った方法で覚えていただければよいかと思いますが、
ここでは参考として、各メソッドを覚える順番を提案してみます。
最初に覚えるメソッド
まずはhead
メソッドを覚えましょう。
文字列の先頭1文字を取得する、基本となるメソッドです。
headOption
は、文字列が空文字である可能性がある場合に使用するメソッドです。
次に覚えるメソッド
次に覚えるべきはtail
メソッドです。
head
メソッドで取得したあとの「残り」「それ以外」の部分です。
そのあと
その次はlast
/ init
を覚えましょう。
この2つは、head
/ tail
を逆転させて、末尾から数えるようにしたものです。
lastOption
は、文字列が空文字である可能性がある場合に使用するメソッドです。
そしてこんどは、take
/ drop
を覚えましょう。
この二つはhead
/ tail
が「1文字」に限定しているのを、どんな文字数でも扱えるよう一般化したものです。
最後に覚えるのがtakeRight
/ dropRight
です。
この二つは、take
/drop
を逆転させて、末尾から数えるようにしたものです。
あるいは、last
/ drop
を一般化したものと考えることもできます。
10種のメソッドの使い方
先頭1文字
それでは、8種類のメソッドについてそれぞれご紹介していきます。
例として以下の文字列を使用します。
val title = "Scala逆引き解説|Scalapedia"
まずは先頭の1文字を処理するメソッドを見ていきましょう。
先頭の1文字を基準に、それを取得したり切り落としたりするには、head
あるいはtail
メソッドを使用します。
文字列の先頭1文字を取得するには「head
メソッド」
head
メソッドを使用すると、文字列の先頭の1文字を取得することができます。
それでは、先頭の1文字を取得して標準出力に出力してみましょう。
println(title.head)
以下のように先頭の1文字だけが表示されます。
S
空文字かもしれない場合には「headOption
メソッド」
head
メソッドを使用する際には、文字列の長さに注意する必要があります。
空文字である文字列に対してhead
メソッドを使用した場合には、java.lang.NoSuchElementException
を投げます。
println("".head)
java.util.NoSuchElementException: head of empty String
例外発生を防ぎ0文字の場合に対応するためには、headOption
メソッドを使用します。
println(title.headOption) println("".headOption)
Some(S) None
文字列の先頭1文字を除去するには「tail
メソッド」
tail
メソッドを使用すると、文字列の先頭の1文字を切り落とすことができます。
他にも以下のようにさまざまな言い方をすることができます。
- 先頭1文字を除去した文字列を取得する
- 先頭1文字以外の文字列を取得する
- 2文字目以降の文字列を取得する
それでは、2文字目以降の部分を取得して標準出力に出力してみましょう。
val title = "Scala逆引き解説|Scalapedia"
println(title.tail)
これを実行すると、以下のように2文字目以降の部分だけが表示されます。
cala逆引き解説|Scalapedia
空文字かもしれない文字列にtail
を実行する場合には例外処理が必要
Dotty(Scala 3.0)を使用している場合で、文字列が空文字である場合には、tail
メソッドを実行するとjava.lang.UnsupportedOperationException
が投げられます。
println("".tail)
java.lang.UnsupportedOperationException: empty.tail
head
メソッドには空文字がありうる場合の回避策としてheadOption
が用意されていましたが、tail
メソッドには空文字の場合の回避策がありません。
したがって、自前で回避策をとる必要があります。
手っ取り早く処理するには、util.Try
で括ってtoOption
メソッドを使用する方法があります。
import scala.util.Try val tailOption = Try("".tail).toOption println(tailOption)
None
末尾1文字
末尾の1文字を基準に、それを取得したり切り落としたりするには、last
あるいはinit
メソッドを使用します。
文字列の末尾を取得するには「last
メソッド」
last
メソッドを使用すると、文字列の末尾の1文字を取得することができます。
それでは、末尾の1文字を取得して標準出力に出力してみましょう。
val title = "Scala逆引き解説|Scalapedia"
println(title.last)
以下のように末尾の1文字だけが表示されます。
a
空文字かもしれない場合には「lastOption
メソッド」
head
メソッドと同様に、空文字である文字列に対してlast
メソッドを使用した場合には、java.lang.NoSuchElementException
を投げます。
println("".last)
java.util.NoSuchElementException: last of empty String
例外発生を防ぎ0文字の場合に対応するためには、lastOption
メソッドを使用します。
println(title.lastOption) println("".lastOption)
Some(a) None
文字列の末尾1文字を切り落とすには「init
メソッド」
init
メソッドを使用すると、文字列の末尾の1文字を切り落とすことができます。
tail
メソッドと同様に、以下のような言い方をすることができます。
- 末尾1文字を除去した文字列を取得する
- 末尾1文字以外の文字列を取得する
- 末尾から2文字目以降の文字列を取得する
それでは、末尾1文字以外の部分文字列を取得して標準出力に出力してみましょう。
val title = "Scala逆引き解説|Scalapedia"
println(title.init)
これを実行すると、以下のように2文字目以降の部分だけが表示されます。
Scala逆引き解説|Scalapedi
空文字かもしれない文字列にinit
を実行する場合には例外処理が必要
Scala 2.12を使用している場合で、文字列が空文字である場合には、init
メソッドを実行するとjava.lang.UnsupportedOperationException
が投げられます。
println("".init)
java.lang.UnsupportedOperationException: empty.init
head
メソッドには空文字がありうる場合の回避策としてheadOption
が用意されていましたが、init
メソッドには空文字の場合の回避策がありません。
したがって、自前で回避策をとる必要があります。
手っ取り早く処理するには、util.Try
で括ってtoOption
メソッドを使用する方法があります。
val initOption = util.Try("".init).toOption println(initOption)
None
Scala 2.13以降はそのようなことはありませんので、気にせず使ってください。
先頭n文字
先頭のn文字を基準に、それを取得したり切り落としたりするには、take
あるいはdrop
メソッドを使用します。
文字列の先頭n文字を取得するには「take
メソッド」
take
メソッドを使用すると、文字列の先頭のn文字を取得することができます。
それでは、先頭のn文字を取得して標準出力に出力してみましょう。
val title = "Scala逆引き解説|Scalapedia"
println(title.take(11))
以下のように先頭のn文字が表示されます。
Scala逆引き解説|
take
メソッドの場合は、head
メソッドと異なり、文字列が空文字でも例外を返すことはありません。
println("".take(11))
文字列の先頭n文字を切り落とすには「drop
メソッド」
drop
メソッドを使用すると、文字列の先頭のn文字を切り落とすことができます。
それでは、先頭のn文字以外の部分を取得して標準出力に出力してみましょう。
val title = "Scala逆引き解説|Scalapedia"
println(title.drop(11))
これを実行すると、以下のように先頭のn文字を除いた部分だけが表示されます。
Scalapedia
drop
メソッドは、文字列が空文字でも例外を返すことはありません。
println("".drop(11))
末尾n文字
末尾のn文字を基準に、それを取得したり切り落としたりするには、takeRight
あるいはdropRight
メソッドを使用します。
文字列の末尾n文字を取得するには「takeRight
メソッド」
takeRight
メソッドを使用すると、文字列の末尾のn文字を取得することができます。
それでは、末尾のn文字を取得して標準出力に出力してみましょう。
val title = "Scala逆引き解説|Scalapedia"
println(title.takeRight(11))
以下のように末尾のn文字だけが表示されます。
|Scalapedia
takeRight
メソッドは、take
メソッドと同様に、文字列が空文字でも例外を返すことはありません。
println("".takeRight(11))
文字列の末尾n文字を切り落とすには「dropRight
メソッド」
dropRight
メソッドを使用すると、文字列の末尾のn文字を切り落とすことができます。
それでは、末尾のn文字以外の部分を取得して標準出力に出力してみましょう。
val title = "Scala逆引き解説|Scalapedia"
println(title.dropRight(11))
これを実行すると、以下のように末尾のn文字を除いた部分だけが表示されます。
Scala逆引き解説
dropRight
メソッドは、文字列が空文字でも例外を返すことはありません。
println("".dropRight(11))