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