substring
日本語 | 部分文字列 |
英語 | sub of string |
ふりがな | さぶすとりんぐ |
フリガナ | サブストリング |
文字列を分割するメソッド。
Stringクラス及びStringBufferクラスのメソッド。
指定したインデックスナンバーから指定したインデックスナンバーまでの文字列を抜き出し、戻り値として返す。「分割」と言っても内部に保存してある文字列は変更されず、「分割後の文字列」を戻り値として返すだけである。
このメソッドにはオーバーロードによって引数1つのメソッドと引数が2つのメソッドの2種類がある。
引数1つのメソッドは、指定したインデックスナンバー以降の文字列を全て返す。つまり、文字列の前半部分を消去し、後半部分だけを返すメソッドである。
引数2つのメソッドは、第1引数で指定したインデックスナンバーから、第2引数で指定したインデックスナンバーのひとつ前までの文字列を取得する。つまり文字列の左右を消去し、中間部分のみを返すメソッドである。
一般業務の多くでは、たとえば「ABC1234YZ」のような「固定文字数のコード」で商品やグループ等を区別することが多く、そのシステム化にあたり「コードを分解し、コード毎に異なる処理をする」ことが必要な場合がある。
たとえば「ABC1234YZ」といったコードの例の場合、中央の数字4文字が「商品コード」で、この商品コードだけを抜き取り画面表示を行う、といったことが非常に多い。
こういった場合にsubstring()メソッドは非常に役立つことになる。
ただし、substring()メソッドは引数の指定が少し複雑なこと、指定したインデックスナンバーが文字列のサイズを超えるとIndexOutOfBoundsException例外が投げられることなどといった難しい部分もある。
また、抜き出す機能はsubstring()メソッドでできるとしても、文字列が固定長でない場合や、複数の種類のコードが混在している場合に「どこからどこまでを抜き出せばいいのか」ということを調べるのが難しく、その調査結果を元にsubstring()メソッドを呼び出す際のインデックスナンバーの指定方法も複雑になる傾向にあるという問題点もある。
これらの代替案として正規表現を用いた検索・置換がある。正規表現には「正規表現そのものが難しい」「処理が重くなる傾向にある」ため、状況に応じてどちらを使用するか選択するのがいいだろう。
Stringクラス及びStringBufferクラスのメソッド。
指定したインデックスナンバーから指定したインデックスナンバーまでの文字列を抜き出し、戻り値として返す。「分割」と言っても内部に保存してある文字列は変更されず、「分割後の文字列」を戻り値として返すだけである。
このメソッドにはオーバーロードによって引数1つのメソッドと引数が2つのメソッドの2種類がある。
引数1つのメソッドは、指定したインデックスナンバー以降の文字列を全て返す。つまり、文字列の前半部分を消去し、後半部分だけを返すメソッドである。
引数2つのメソッドは、第1引数で指定したインデックスナンバーから、第2引数で指定したインデックスナンバーのひとつ前までの文字列を取得する。つまり文字列の左右を消去し、中間部分のみを返すメソッドである。
一般業務の多くでは、たとえば「ABC1234YZ」のような「固定文字数のコード」で商品やグループ等を区別することが多く、そのシステム化にあたり「コードを分解し、コード毎に異なる処理をする」ことが必要な場合がある。
たとえば「ABC1234YZ」といったコードの例の場合、中央の数字4文字が「商品コード」で、この商品コードだけを抜き取り画面表示を行う、といったことが非常に多い。
こういった場合にsubstring()メソッドは非常に役立つことになる。
ただし、substring()メソッドは引数の指定が少し複雑なこと、指定したインデックスナンバーが文字列のサイズを超えるとIndexOutOfBoundsException例外が投げられることなどといった難しい部分もある。
また、抜き出す機能はsubstring()メソッドでできるとしても、文字列が固定長でない場合や、複数の種類のコードが混在している場合に「どこからどこまでを抜き出せばいいのか」ということを調べるのが難しく、その調査結果を元にsubstring()メソッドを呼び出す際のインデックスナンバーの指定方法も複雑になる傾向にあるという問題点もある。
これらの代替案として正規表現を用いた検索・置換がある。正規表現には「正規表現そのものが難しい」「処理が重くなる傾向にある」ため、状況に応じてどちらを使用するか選択するのがいいだろう。
参考サイト
// Sample.java
public class Sample
{
public static void main( String[] args )
{
String string = "あいうえお";
// どの文字が「何番目か」を出力します。
System.out.println( string.charAt( 0 ) );
// あ
System.out.println( string.charAt( 1 ) );
// い
System.out.println( string.charAt( 2 ) );
// う
System.out.println( string.charAt( 3 ) );
// え
System.out.println( string.charAt( 4 ) );
// お
// 文字のインデックスナンバーは、0から始まります。
// つまり配列やコレクションと同じです。
// また、Javaの文字列の文字コードはUnicodeなので、
// 日本語の文字列でも1文字1要素です。
// 引数ひとつのsubstring()メソッド。
// 「指定したインデックスナンバー以降の文字列」を
// 取得します。指定した文字列を含みます。
System.out.println( string.substring( 3 ) );
// えお
// 引数ふたつのsubstring()メソッド。
// 「第1引数のインデックスナンバーから、
// 第2引数のインデックスナンバーのひとつ前の
// 文字までの文字列」を取得します。
// 第1引数の文字は含みますが、第2引数の文字は含みません。
System.out.println( string.substring( 1, 3 ) );
// いう
// 引数ふたつのsubstring()メソッドは、
// 「第2引数 - 第1引数 = 取り出す文字列の文字数」
// になります。
// また、第2引数に文字列の文字列数を渡すと、
// 引数ひとつのものと同じ結果が返ります。
// この機能を実現するために、第2引数は「ひとつ前の文字」に
// なっています。
System.out.println( string.substring( 1, string.length() ) );
// いうえお
// たとえば「後ろから2文字目まで」
// (上記の例だと「あいうえ」)を取得したい場合。
System.out.println( string.substring( 0, string.length() - 1 ) );
// あいうえ
// たとえば「先頭から2文字目から3文字」
// (上記の例だと「いうえ」)を取得したい場合。
System.out.println( string.substring( 1, 1 + 3 ) );
// いうえ
// 「1 + 3」の「1」は、第1引数で渡した「1」です。
// この値が変数iの場合には「i + 3」とすればいいわけです。
// ただし、第1引数はもちろん、第2引数も、文字列の範囲外を
// 指定するとIndexOutOfBoundsException例外が投げられます。
try
{
System.out.println( string.substring( 0, string.length() + 1 ) );
}
catch( IndexOutOfBoundsException e )
{
e.printStackTrace();
// java.lang.StringIndexOutOfBoundsException: String index out of range: 6
// at java.lang.String.substring(String.java:1477)
// at Sample.main(Sample.java:64)
}
// そのため、第2引数で「固定の文字数で取得」する場合には
// 文字数を取得して超えていないかチェックする必要があります。
// 上記の例で分かると思いますが、substring()メソッドは
// 中の文字列を変更しません。これはStringクラスの全メソッド
// 共通の仕様です。
System.out.println( string );
// あいうえお
}
}
public class Sample
{
public static void main( String[] args )
{
String string = "あいうえお";
// どの文字が「何番目か」を出力します。
System.out.println( string.charAt( 0 ) );
// あ
System.out.println( string.charAt( 1 ) );
// い
System.out.println( string.charAt( 2 ) );
// う
System.out.println( string.charAt( 3 ) );
// え
System.out.println( string.charAt( 4 ) );
// お
// 文字のインデックスナンバーは、0から始まります。
// つまり配列やコレクションと同じです。
// また、Javaの文字列の文字コードはUnicodeなので、
// 日本語の文字列でも1文字1要素です。
// 引数ひとつのsubstring()メソッド。
// 「指定したインデックスナンバー以降の文字列」を
// 取得します。指定した文字列を含みます。
System.out.println( string.substring( 3 ) );
// えお
// 引数ふたつのsubstring()メソッド。
// 「第1引数のインデックスナンバーから、
// 第2引数のインデックスナンバーのひとつ前の
// 文字までの文字列」を取得します。
// 第1引数の文字は含みますが、第2引数の文字は含みません。
System.out.println( string.substring( 1, 3 ) );
// いう
// 引数ふたつのsubstring()メソッドは、
// 「第2引数 - 第1引数 = 取り出す文字列の文字数」
// になります。
// また、第2引数に文字列の文字列数を渡すと、
// 引数ひとつのものと同じ結果が返ります。
// この機能を実現するために、第2引数は「ひとつ前の文字」に
// なっています。
System.out.println( string.substring( 1, string.length() ) );
// いうえお
// たとえば「後ろから2文字目まで」
// (上記の例だと「あいうえ」)を取得したい場合。
System.out.println( string.substring( 0, string.length() - 1 ) );
// あいうえ
// たとえば「先頭から2文字目から3文字」
// (上記の例だと「いうえ」)を取得したい場合。
System.out.println( string.substring( 1, 1 + 3 ) );
// いうえ
// 「1 + 3」の「1」は、第1引数で渡した「1」です。
// この値が変数iの場合には「i + 3」とすればいいわけです。
// ただし、第1引数はもちろん、第2引数も、文字列の範囲外を
// 指定するとIndexOutOfBoundsException例外が投げられます。
try
{
System.out.println( string.substring( 0, string.length() + 1 ) );
}
catch( IndexOutOfBoundsException e )
{
e.printStackTrace();
// java.lang.StringIndexOutOfBoundsException: String index out of range: 6
// at java.lang.String.substring(String.java:1477)
// at Sample.main(Sample.java:64)
}
// そのため、第2引数で「固定の文字数で取得」する場合には
// 文字数を取得して超えていないかチェックする必要があります。
// 上記の例で分かると思いますが、substring()メソッドは
// 中の文字列を変更しません。これはStringクラスの全メソッド
// 共通の仕様です。
System.out.println( string );
// あいうえお
}
}
// Sample.java public class Sample { public static void main( String[] args ) { String string = "あいうえお"; // どの文字が「何番目か」を出力します。 System.out.println( string.charAt( 0 ) ); // あ System.out.println( string.charAt( 1 ) ); // い System.out.println( string.charAt( 2 ) ); // う System.out.println( string.charAt( 3 ) ); // え System.out.println( string.charAt( 4 ) ); // お // 文字のインデックスナンバーは、0から始まります。 // つまり配列やコレクションと同じです。 // また、Javaの文字列の文字コードはUnicodeなので、 // 日本語の文字列でも1文字1要素です。 // 引数ひとつのsubstring()メソッド。 // 「指定したインデックスナンバー以降の文字列」を // 取得します。指定した文字列を含みます。 System.out.println( string.substring( 3 ) ); // えお // 引数ふたつのsubstring()メソッド。 // 「第1引数のインデックスナンバーから、 // 第2引数のインデックスナンバーのひとつ前の // 文字までの文字列」を取得します。 // 第1引数の文字は含みますが、第2引数の文字は含みません。 System.out.println( string.substring( 1, 3 ) ); // いう // 引数ふたつのsubstring()メソッドは、 // 「第2引数 - 第1引数 = 取り出す文字列の文字数」 // になります。 // また、第2引数に文字列の文字列数を渡すと、 // 引数ひとつのものと同じ結果が返ります。 // この機能を実現するために、第2引数は「ひとつ前の文字」に // なっています。 System.out.println( string.substring( 1, string.length() ) ); // いうえお // たとえば「後ろから2文字目まで」 // (上記の例だと「あいうえ」)を取得したい場合。 System.out.println( string.substring( 0, string.length() - 1 ) ); // あいうえ // たとえば「先頭から2文字目から3文字」 // (上記の例だと「いうえ」)を取得したい場合。 System.out.println( string.substring( 1, 1 + 3 ) ); // いうえ // 「1 + 3」の「1」は、第1引数で渡した「1」です。 // この値が変数iの場合には「i + 3」とすればいいわけです。 // ただし、第1引数はもちろん、第2引数も、文字列の範囲外を // 指定するとIndexOutOfBoundsException例外が投げられます。 try { System.out.println( string.substring( 0, string.length() + 1 ) ); } catch( IndexOutOfBoundsException e ) { e.printStackTrace(); // java.lang.StringIndexOutOfBoundsException: String index out of range: 6 // at java.lang.String.substring(String.java:1477) // at Sample.main(Sample.java:64) } // そのため、第2引数で「固定の文字数で取得」する場合には // 文字数を取得して超えていないかチェックする必要があります。 // 上記の例で分かると思いますが、substring()メソッドは // 中の文字列を変更しません。これはStringクラスの全メソッド // 共通の仕様です。 System.out.println( string ); // あいうえお } }