[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)