文字列の先頭や末尾を、取得したり切り落としたりする方法

Scala 3 (Dotty 0.26.0-RC1) 2.13.3 2.12.12
最終更新:2020年5月19日

[AD] scalapediaでは記事作成ボランティアを募集しています

「文字列の先頭の文字を取得したい」「末尾n文字を切り落としたい」なんてことありますよね。
しかし「どのように処理すればいいかな、、、」と迷っている人がほとんどだと思います。

この記事では、部分文字列を取得するためにあらかじめ用意されている、Scalaのたくさんの便利メソッドをご紹介します。

10種のメソッドを理解する

文字列の先頭や末尾の文字を処理するメソッドは、全部で10種類あります。

  • 先頭から / 末尾から
  • 1文字を / n文字を
  • 取得する / 除去する

という、2パターン × 2パターン × 2パターン で8種類あります。

また、特殊な場合に先頭or末尾の1文字を取得するメソッドとして2種類あり、これらを合わせて10種類です。

早速ですが、早見表を掲載します。
あれこれと文字で説明すると逆に分かりづらいかもしれないのですが、表を見れば手っ取り早く全体像を捉えることができるでしょう。

〜を取得する〜以外を取得する
先頭1文字head / headOptiontail
末尾1文字last / lastOptioninit
先頭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))

サイト内検索


カテゴリ「文字列処理」の記事

文字列をエスケープしたり復元したりする方法(Apache Commons Text) JavaとScalaのString/StringBuilder/StringBuffer使い分け事情 文字列を分割する方法(split・splitAt・linesIterator・linesWithSeparatorsメソッド) trimメソッドで文字列の前後の空白を除去する 文字列が一致するか比較する方法/大文字・小文字を区別せずに比較する方法 特定の文字の文字コード(コード・ポイント)を取得する replaceメソッドなど、文字列を置換する方法を紹介 文字列の先頭や末尾を、取得したり切り落としたりする方法 containsメソッドでStringに特定の文字列が含まれるか調べる方法 数値を文字列に変換する方法 stripメソッドで文字列の前後の全角空白を除去する 文字列を数値に変換するには?to○○メソッドと注意点について 文字列を辞書的に比較する方法/大文字・小文字を区別せずに比較する方法 文字列が特定の文字列で始まるか・終わるかを調べる方法 【getBytes&size】文字列のバイト長を取得する方法 substringでStringを切り取り、部分文字列を抽出する方法 StringOpsとWrappedStringの違いは? 文字列を連結するには?+演算子やString interpolationの使い方 文字列の大文字へ・小文字へ変換する方法 文字列を逆順にする方法 文字列の文字コード(文字セット)を変換する方法 文字列の長さを取得する方法:lengthとcodePointCountの使い分け 文字列をURLエンコード・デコードする方法 文字列が正規表現に合致するか調べる方法 この文字の位置はどこ?文字列のインデックスを取得する方法 文字列をバイト列に、またはバイト列を文字列に変換する方法

カテゴリ「文字列処理」の記事

文字列をエスケープしたり復元したりする方法(Apache Commons Text) JavaとScalaのString/StringBuilder/StringBuffer使い分け事情 文字列を分割する方法(split・splitAt・linesIterator・linesWithSeparatorsメソッド) trimメソッドで文字列の前後の空白を除去する 文字列が一致するか比較する方法/大文字・小文字を区別せずに比較する方法 特定の文字の文字コード(コード・ポイント)を取得する replaceメソッドなど、文字列を置換する方法を紹介 文字列の先頭や末尾を、取得したり切り落としたりする方法 containsメソッドでStringに特定の文字列が含まれるか調べる方法 数値を文字列に変換する方法 stripメソッドで文字列の前後の全角空白を除去する 文字列を数値に変換するには?to○○メソッドと注意点について 文字列を辞書的に比較する方法/大文字・小文字を区別せずに比較する方法 文字列が特定の文字列で始まるか・終わるかを調べる方法 【getBytes&size】文字列のバイト長を取得する方法 substringでStringを切り取り、部分文字列を抽出する方法 StringOpsとWrappedStringの違いは? 文字列を連結するには?+演算子やString interpolationの使い方 文字列の大文字へ・小文字へ変換する方法 文字列を逆順にする方法 文字列の文字コード(文字セット)を変換する方法 文字列の長さを取得する方法:lengthとcodePointCountの使い分け 文字列をURLエンコード・デコードする方法 文字列が正規表現に合致するか調べる方法 この文字の位置はどこ?文字列のインデックスを取得する方法 文字列をバイト列に、またはバイト列を文字列に変換する方法