Java の String の補足

概要

Javaの基本APIである java.lang.String についての補足資料です。 DBFluteと直接関係はありませんが、基本中の基本で合わせて利用することが多いので、 補完的な資料として用意されています。(よく利用される機能のみ紹介)

substring()

文字列の一部分を切り取ります。

メソッド仕様

substring(int fromIndex)
指定された Index からの文字列を戻す (どこから、最後まで)
マイナス値や対象文字列の文字数を超える Index を指定すると例外
substring(int fromIndex, int toIndex)
指定された範囲の文字列を戻す (どこから、どこまで)
toIndex は指定された Index "まで" を示す
"toIndex - fromIndex" が切り取る文字列の数となる
マイナス値や対象文字列の文字数を超える Index を指定すると例外
toIndex よりも fromIndex の方が大きい場合は例外

基本的な使い方

引数の Index を指定することで、切り取る範囲を決定します。Index は 0 始まりであり、文字と文字の間を指し示すようなイメージでいると良いでしょう。

jflute
[0] j [1] f [2] l [3] u [4] t [5] e [6]

例えば、1 から 4 までという指定であれば "flu" が切り取られます。 最後の Index は、対象文字列の文字数、String#length() と同じ値となるため、Index にはその文字数を超える値(例えば 7)を指定することはできません(例外となる)。

e.g. substring() の基本 @Java
String name = "jflute"; // [0] j [1] f [2] l [3] u [4] t [5] e [6]

String ... = name.substring(1); // "flute" A. 最初の一文字を除去
String ... = name.substring(2); // "lute" B. 最初の二文字を除去
String ... = name.substring(0, 3); // "jfl" C. 最初の3文字
String ... = name.substring(1, 4); // "flu" D. 一つ飛ばして3文字

int len = name.length();
String ... = name.substring(len - 1, len); // "e" E. 最後の一文字を取得
String ... = name.substring(len - 2, len); // "te" F. 最後の二文字を取得

長さチェックして分岐

文字数が大きい場合のみ切り取るというような場合は、length() と合わせてif文で分岐させます。

e.g. substring() を分岐で利用 @Java
// /- - - - - - - - - - - - - - - -
// 4文字を超える文字列ならそれ以降を除去する
// (つまり、文字列を必ず4文字以下のしたい)
// - - - - - - - - - -/
String name = "jflute";
String cutStr;
if (name.length() > 4) { // 4文字を超える(5文字以上なら)
    cutStr = name.substring(0, 4); // 4文字目までを切り取る
} else {
    cutStr = name; // 切り取りようがない、もしくは、切り取る必要がない
}

とある文字で切り取り

とある文字で文字列を切り取る場合は、indexOf() や lastIndexOf() と合わせて利用します。 indexOf() で取得した Index は、substring() でそのまま利用できる Index となるため、とある文字の Index を探して、その文字を基準に文字列を切り取ることができます。

e.g. indexOf() と substring() のコラボレーション @Java
String name = "jflute";
int index = name.indexOf("u");
if (index >= 0) { // 指定した文字が存在するなら
    String ... = name.substring(0, index); // "jfl"
    String ... = name.substring(index);     // "ute" ※"u"も含む
    String ... = name.substring(index + "u".length()); // "te" ※"u"は含まない
} else {
    ... // 要件に応じて例外にするなりなんなり
}

ファイルパスなどから拡張子を取得したり、パスを除去したファイル名を取得したりする場合は、指定された文字列の最後の Index を利用する必要があるため、lastIndexOf() を活用します。

e.g. lastIndexOf() と substring() のコラボレーション @Java
String path = "topic/programming/java/string.html";
String delimiter = "/";
int index = path.lastIndexOf(delimiter);
String fileName;
if (index >= 0) { // 指定した文字が存在するなら
    fileName = path.substring(index + delimiter.length()); // "string.html"
} else {
    fileName = path; // 既にパス部分が存在していないのでそのまま
}

indexOf(), lastIndexOf()

指定された文字の Index (文字列の中の、その文字の位置)を取得します。

メソッド仕様

indexOf(String str)
指定された文字の "最初" に見つかった Index を戻す
文字の一致判定において、大文字小文字は区別される
指定された文字が対象文字列に存在しない場合は -1 (マイナス値)を戻す
lastIndexOf(String str)
指定された文字の "最後" に見つかった Index を戻す
他は indexOf() と同じ

基本的な使い方

Index は 0 始まりであり、文字と文字の間を指し示すようなイメージでいると良いでしょう。

jflute
[0] j [1] f [2] l [3] u [4] t [5] e [6]

例えば、"u" を指定したら Index は 3 となり、"f" を指定したら 1 となります。

e.g. indexOf() の基本 @Java
String name = "jflute"; // [0] j [1] f [2] l [3] u [4] t [5] e [6]

int ... = name.indexOf("f"); // 1
int ... = name.indexOf("u"); // 3
int ... = name.indexOf("j"); // 0
int ... = name.indexOf("x"); // -1 : その文字が存在しない場合

そもそもその文字列の中に指定された文字が無い場合は、Index は -1 (マイナス値)となります。通常、このマイナス値の Index を substring() などで利用すると例外が発生してしまうため、文字の有無が確定しない場合は "0以上である" という if 文で囲って処理をします。

e.g. indexOf() で文字の有無が確定しない場合 @Java
// /- - - - - - - - - - - - - - - - - - - - - -
// "u" が存在する文字列なら、"u" より前の文字列を取得する
// - - - - - - - - - -/
String name = ...;
int index = name.indexOf("u");
if (index >= 0) { // 指定した文字が存在するなら
    String ... = name.substring(0, index); // "jflute" なら "jfl"
} else {
    ... // 要件に応じて例外にするなりなんなり
}

TODO jflute