substringでStringを切り取り、部分文字列を抽出する方法

Scala 3.3.4
最終更新:2023年12月7日

[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください

この記事では、Scalaで文字列から部分文字列を抽出する方法について解説します。

部分文字列を取得するにはjava.lang.Stringクラスのsubstringメソッドを使います。
StringOpsなどに便利メソッドが用意されている、ということはありません。

substringメソッドは2つ用意されているので、どのように切り出したいかによって使い分けることになります。

変数を一つだけ指定すると、n文字を切り捨てる

substringメソッドは、引数を一つだけ指定することにより、文字列の先頭から何文字かを切り落とすことができます。

java.lang.Stringには以下のように定義されています。

java
public 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で包んでいるので投げられた例外はキャッチされ、toOptionOptionへと変換された結果、期待通りNoneが返ってきます。

None

変数を二つ指定すると、前からn文字を切り捨てて、その後m文字目までの文字列を取得する

substringメソッドは、変数を二つ指定することにより、文字列の前後からそれぞれ何文字かずつ切り捨てることができます。

java.lang.Stringには以下のように定義されています。

java
public String substring(int beginIndex, int endIndex)

Scalaでの表記に合わせると以下のようになります。

def substring(beginIndex: Int, endIndex: Int): String

引数をbeginIndexendIndexとすると、先頭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オブジェクトの長さより大きい場合
  • beginIndexendIndexよりも大きい場合

beginIndexendIndexがこれらの制約に違反しないことが保証されていない場合には、 IndexOutOfBoundsExceptionを処理する必要があります。

今回はお手軽にscala.util.TrytoOptionを使ってOption型へと変換してみましょう。

val string = "substring" import scala.util.Try val result = Try(string.substring(100, 150)).toOption println(result)

引数に指定したbeginIndexendIndexも制約から外れるので例外が投げられます。 Tryで包んでいるので投げられた例外はキャッチされ、toOptionOptionへと変換された結果、期待通りNoneが返ってきます。

None

サイト内検索


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

文字列をエスケープしたり復元したりする方法(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エンコード・デコードする方法 文字列が正規表現に合致するか調べる方法 この文字の位置はどこ?文字列のインデックスを取得する方法 文字列をバイト列に、またはバイト列を文字列に変換する方法