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 );
// あいうえお
}
}




