[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
この記事では、Scalaで文字列から部分文字列を抽出する方法について解説します。
部分文字列を取得するにはjava.lang.String
クラスのsubstring
メソッドを使います。
StringOps
などに便利メソッドが用意されている、ということはありません。
substring
メソッドは2つ用意されているので、どのように切り出したいかによって使い分けることになります。
変数を一つだけ指定すると、n文字を切り捨てる
substring
メソッドは、引数を一つだけ指定することにより、文字列の先頭から何文字かを切り落とすことができます。
java.lang.String
には以下のように定義されています。
javapublic String substring(int beginIndex)
Scalaでの表記に合わせると以下のようになります。
def substring(beginIndex: Int): String
引数をbeginIndex
とすると、先頭からbeginIndex
個の文字を切り捨てることになります。
val string = "substring" println(string.substring(3))
結果は次のようになります。
string
インデックスbeginIndex
以降の文字列を取得する
Javaのインデックスを用いて説明します。
指定した引数はその文字列中のインデックスを表しています。
インデックスbeginIndex-1
までを捨てて、インデックスbeginIndex
以降の文字列を返します。
部分文字列の長さは文字列の長さ-beginIndex
となります。
例外が発生するので処理すること
このメソッドにおいては、使用時に例外が発生する可能性があります。
指定した引数beginIndex
が負の場合、あるいはこのStringオブジェクトの長さより大きい場合は、
IndexOutOfBoundsException
が発生します。
beginIndex
がこの制約に違反しないことが保証されていない場合には、
IndexOutOfBoundsException
を処理する必要があります。
val string = "substring" import scala.util.Try val result = Try(string.substring(100)).toOption println(result)
引数に指定したbeginIndex
は制約から外れるので例外が投げられます。
Try
で包んでいるので投げられた例外はキャッチされ、toOption
でOption
へと変換された結果、期待通りNone
が返ってきます。
None
java.lang.String#substring(int)
変数を二つ指定すると、前からn文字を切り捨てて、その後m文字目までの文字列を取得する
substring
メソッドは、変数を二つ指定することにより、文字列の前後からそれぞれ何文字かずつ切り捨てることができます。
java.lang.String
には以下のように定義されています。
javapublic String substring(int beginIndex, int endIndex)
Scalaでの表記に合わせると以下のようになります。
def substring(beginIndex: Int, endIndex: Int): String
引数をbeginIndex
とendIndex
とすると、先頭beginIndex
文字を切り捨て、
さらに、先頭からendIndex
個目の文字以降を切り捨てて残った部分を返すことになります。
val string = "substring" println(string.substring(3, 6))
結果は次のようになります。
str
インデックスbeginIndex
以降、endIndex-1
までの文字列を取得する
Javaのインデックスを用いて説明します。
インデックスbeginIndex-1
までを捨てて、beginIndex
以降、endIndex-1
までの文字列を返し、さらにendIndex
以降を捨てます。
部分文字列の長さはendIndex-beginIndex
となります。
例外が発生するので処理すること
こちらのメソッドにおいても、使用時に例外が発生する可能性があります。
以下の場合にIndexOutOfBoundsException
が発生します。
- 指定した引数
beginIndex
が負の場合 endIndex
がこのStringオブジェクトの長さより大きい場合beginIndex
がendIndex
よりも大きい場合
beginIndex
とendIndex
がこれらの制約に違反しないことが保証されていない場合には、
IndexOutOfBoundsException
を処理する必要があります。
今回はお手軽にscala.util.Try
のtoOption
を使ってOption
型へと変換してみましょう。
val string = "substring" import scala.util.Try val result = Try(string.substring(100, 150)).toOption println(result)
引数に指定したbeginIndex
もendIndex
も制約から外れるので例外が投げられます。
Try
で包んでいるので投げられた例外はキャッチされ、toOption
でOption
へと変換された結果、期待通りNone
が返ってきます。
None
java.lang.String#substring(int, int)