|
|
クラスライブラリの利用(Stringクラス) |
H.Kamifuji . |
文字列を扱うStringクラスについて見ていきます。 クラス定義は下記のようになっています。 java.lang.Object | +-- java.lang.String public final class String extends Object implements Serializable, ComparableStringクラスはjava.langパッケージに含まれますのでimport文は必要ありません。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
文字列そのものや、変数に格納されている文字列の長さを求めます。 length public int length()この文字列の長さを返します。長さは文字列内の 16 ビット Unicode 文字の数に等しくなります。 戻り値: このオブジェクトによって表される文字シーケンスの長さ 長さはバイト数ではなく、文字数になります。例えば下記のような感じです。 String str1 = new String("Hello World!"); String str2 = new String("こんにちは"); System.out.println(str1 + "の長さは" + str1.length() + "です"); System.out.println(str2 + "の長さは" + str2.length() + "です");上記を実際に実行してみると、「Hello World!」は12、「こんにちは」は5が帰ってきます。 では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。class testString1{ public static void main(String args[]){ String str1 = new String("Hello World!"); String str2 = new String("こんにちは"); System.out.println(str1 + "の長さは" + str1.length() + "です"); System.out.println(str2 + "の長さは" + str2.length() + "です"); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd String_Class]$ javac testString1.java [xxxxxxxx@dddddddddd String_Class]$ java testString1 Hello World!の長さは12です こんにちはの長さは5です [xxxxxxxx@dddddddddd String_Class]$ |
元の文字列から一部分を取り出して新しい文字列を作成します。 substring public String substring(int beginIndex, int endIndex)この文字列の部分文字列である新しい文字列を返します。部分文字列は、指定された beginIndex から始まり、インデックス endIndex - 1 にある文字までです。したがって、部分文字列の長さは endIndex-beginIndex になります。 パラメータ: beginIndex - 開始インデックス (この値を含む) endIndex - 終了インデックス (この値を含まない) 戻り値: 指定された部分文字列 例外: IndexOutOfBoundsException - beginIndex が負の値である場合、endIndexがこの String オブジェ クトの長さより大きい場合、あるいはbeginIndex が endIndex より大きい場合 元々の文字列から一部分を抜き出して取得します。抜き出す部分の指定はインデックス番号で指定します。ここで言うインデックスとは下記のようなものです。 "Hello!"という文字列があった場合 インデックス 0 --> H インデックス 1 --> e インデックス 2 --> l インデックス 3 --> l インデックス 4 --> o インデックス 5 --> !よってこの"Hello!"という文字列から"llo"の部分を抜き出すには、「"Hello!".substring(2, 5)」ということになります。(終了インデックスに指定した値は含まれないことに注意して下さい)。 インデックスは半角文字であっても全角文字であっても1文字に対して1つずつ増加します。よって全角文字の場合でも下記のようになります。 "こんにちは"という文字列があった場合 インデックス 0 --> こ インデックス 1 --> ん インデックス 2 --> に インデックス 3 --> ち インデックス 4 --> はでは実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。class testString2{ public static void main(String args[]){ String str1 = new String("Hello World!"); String new_str1 = str1.substring(2, 5); System.out.println(str1 + "のsubstring(2,5)は" + new_str1 + "です"); String str2 = new String("こんにちは"); String new_str2 = str2.substring(2, 4); System.out.println(str2 + "のsubstring(2,4)は" + new_str2 + "です"); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd String_Class]$ javac testString2.java [xxxxxxxx@dddddddddd String_Class]$ java testString2 Hello World!のsubstring(2,5)はlloです こんにちはのsubstring(2,4)はにちです [xxxxxxxx@dddddddddd String_Class]$ |
文字列に含まれる全ての文字を大文字(又は小文字)に変換します。大文字に変換するには「toUpperCase」メソッドを、小文字に変換するには「toLowerCase」メソッドを使います。 toUpperCaseメソッド : toUpperCase public String toUpperCase()デフォルトロケールの規則を使って、この String 内のすべての文字を大文字に変換します。このメソッドは、toUpperCase(Locale.getDefault()) と等価になります。 戻り値: 大文字に変換された String toLowerCaseメソッド : toLowerCase public String toLowerCase()デフォルトロケールの規則を使って、この String 内のすべての文字を小文字に変換します。これは、toLowerCase(Locale.getDefault()) の呼び出しと等価になります。 戻り値: 小文字に変換される String メソッドの説明内で使われているロケールとは、どの地域かということです。地域が日本なら日本語の規則に従って変換するということですので、何か特殊な国の言語を使うのでない限りは気にしないで下さい。 使い方としては下記のような感じです。 "Good Morning"という文字列があった場合 "Good Morning".toUpperCase() --> "GOOD MORNING" "Good Morning".toLowerCase() --> "good morning"大文字小文字が無いような全角文字の場合は何も行われません。 では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。class testString3{ public static void main(String args[]){ String str1 = new String("Good Morning"); String upper_str1 = str1.toUpperCase(); String lower_str1 = str1.toLowerCase(); System.out.println("元の文字列 : " + str1); System.out.println("大文字へ変換 : " + upper_str1); System.out.println("小文字へ変換 : " + lower_str1); String str2 = new String("現在 A.M. 3時20分です"); String upper_str2 = str2.toUpperCase(); String lower_str2 = str2.toLowerCase(); System.out.println("元の文字列 : " + str2); System.out.println("大文字へ変換 : " + upper_str2); System.out.println("小文字へ変換 : " + lower_str2); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd String_Class]$ javac testString3.java [xxxxxxxx@dddddddddd String_Class]$ java testString3 元の文字列 : Good Morning 大文字へ変換 : GOOD MORNING 小文字へ変換 : good morning 元の文字列 : 現在 A.M. 3時20分です 大文字へ変換 : 現在 A.M. 3時20分です 小文字へ変換 : 現在 a.m. 3時20分です [xxxxxxxx@dddddddddd String_Class]$ |
文字列に先頭又は最後に空白文字がくっ付いている場合、それらを全て取り除きます。 trim public String trim()文字列のコピーを返します。先頭と最後の空白は省略されます。 この String オブジェクトが空の文字列を表す場合、あるいはこの Stringオブジェクトによって表される文字シーケンスの最初と最後の文字のコードがどちらも「\u0020」(空白文字) より大きい場合は、この String オブジェクトへの参照が返されます。 文字列内に「\u0020」より大きいコードの文字がない場合は、空の文字列を表す新しい String オブジェクトが生成されて返されます。 戻り値: この文字列の先頭と最後の空白を削除したコピー、またはこの文字列 (先頭と最後に空白が 存在しない場合) このメソッドは、例えば外部のファイルなどからデータを読み込んだ時に、文字列の先頭や最後に空白が含まれてしまっているのを取り除きたい場合に使われます。 使い方としては下記のような感じです。 " Good Morning "という文字列があった場合 " Good Morning ".trim() --> "Good Morning"先頭又は最後に空白がある場合は、何文字合っても全て取り除きます。また文字列の先頭又は最後以外に含まれている空白はそのままです。 では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。class testString4{ public static void main(String args[]){ String str1 = new String(" Good Morning "); System.out.println("元の文字列「" + str1 + "」"); System.out.println("文字数は" + str1.length() + "です"); String new_str1 = str1.trim(); System.out.println("空白を取り除いた文字列「" + new_str1 + "」"); System.out.println("文字数は" + new_str1.length() + "です"); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd String_Class]$ javac testString4.java [xxxxxxxx@dddddddddd String_Class]$ java testString4 元の文字列「 Good Morning 」 文字数は16です 空白を取り除いた文字列「Good Morning」 文字数は12です [xxxxxxxx@dddddddddd String_Class]$ |
文字列を指定された正規表現に一致する位置で分割します。 split public String[] split(String regex, int limit)この文字列を、指定された正規表現に一致する位置で分割します。 この文字列の各部分文字列を含むメソッドにより返される配列は、指定された式に一致する別の部分文字列、またはその文字列の最後で終了します。配列内の部分文字列の順序は、この文字列内で出現する順序になります。入力されたどの部分とも式が一致しない場合、配列は 1 つの要素 (つまり、この文字列) だけを保持します。 limit パラメータは、このパターンの適用回数、つまり、返される配列の長さを制御します。制限 n がゼロより大きい場合、このパターンは n - 1 回以下の回数が適用され、配列の長さは n 以下になります。配列の最後のエントリには、最後にマッチした区切り文字以降の入力シーケンスがすべて含まれます。n が負の値の場合、このパターンの適用回数と配列の長さは制限されません。n がゼロの場合、このパターンの適用回数と配列の長さは制限されませんが、後続の空の文字列は破棄されます。 パラメータ: regex - 正規表現の区切り limit - 結果のしきい値 (上記を参照) 戻り値: この文字列を指定された正規表現に一致する位置で分割して計算された文字列の配列 例外: PatternSyntaxException - 正規表現の構文が無効な場合 例えばCSV形式で記述された文字列を、カンマ(,)の位置で区切って取得する場合で考えて見ます。 String str = "りんご,レモン,すいか,ぶどう"; String[] fruit = str.split(",", 0);上記を実行するとfruitの配列には下記のように格納されます。 fruit[0] = "りんご"; fruit[1] = "レモン"; fruit[2] = "すいか"; fruit[3] = "ぶどう";このように対象となる文字列を指定した区切り文字によって分割し、それぞれを配列の要素として格納します。 2番目の引数は分割する回数です。負の値を指定した場合は制限無しとなります。また0を指定した場合、分割された後で最後の項目が空白の場合にはそれを配列に格納しません。次の例で確認して下さい。 String str = "りんご,,すいか,ぶどう,,,"; String[] fruit = str.split(",", -1);上記を実行するとfruitの配列には下記のように格納されます。 fruit[0] = "りんご"; fruit[1] = ""; fruit[2] = "すいか"; fruit[3] = "ぶどう"; fruit[4] = ""; fruit[5] = ""; fruit[6] = "";同じ文字列に対して2番目の引数に0を指定した場合は次の通りです。 String str = "りんご,,すいか,ぶどう,,,"; String[] fruit = str.split(",", 0);上記を実行するとfruitの配列には下記のように格納されます。 fruit[0] = "りんご"; fruit[1] = ""; fruit[2] = "すいか"; fruit[3] = "ぶどう";以上のように2番目の引数に0を指定した場合、末尾の位置で空白だけが入る配列要素は格納されません。 では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。class testString5{ public static void main(String args[]){ String str = "りんご,レモン,すいか,ぶどう"; String[] fruit = str.split(",", 0); for (int i = 0 ; i < fruit.length ; i++){ System.out.println(i + "番目の要素 = :" + fruit[i]); } } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd String_Class]$ javac testString5.java [xxxxxxxx@dddddddddd String_Class]$ java testString5 0番目の要素 = :りんご 1番目の要素 = :レモン 2番目の要素 = :すいか 3番目の要素 = :ぶどう [xxxxxxxx@dddddddddd String_Class]$ |
文字列に対して指定したパターンに一致する最初の部分を他の文字で置き換えます。「replaceFirst」メソッドを使います。 BoxLayout public BoxLayout(Container target, int axis)指定された正規表現に一致する、この文字列の最初の部分文字列に対し、指定された置換を実行します。 このフォームのメソッド呼び出し str.replaceFirst(regex, repl) では、次の式と正確に同じ結果が得られます。 Pattern.compile(regex).matcher(str).replaceFirst(repl) パラメータ: regex - この文字列との一致を判定する正規表現 戻り値: 結果として得られる String 例外: PatternSyntaxException - 正規表現の構文が無効な場合 例えば「今日の天気は晴れでした。明日の天気は晴れです。」と言う文字列に対して、「晴れ」を「雨」に変換する場合は次のようになります。 String str = "今日の天気は晴れでした。明日の天気は晴れです。"; str = str.replaceFirst("晴れ", "雨");上記の結果、文字列「str」には「今日の天気は雨でした。明日の天気は晴れです。」が格納されます。「晴れ」は対象の文字列の中に2回出現しますが、「replaceFirst」メソッドの場合は最初に一致した文字列だけが置換の対象となります。 置換する対象の文字列には固定の文字列だけではなく正規表現を使ってより柔軟な指定が可能です。 では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。class testString6{ public static void main(String args[]){ String str = "今日の天気は晴れでした。明日の天気は晴れです。"; System.out.println("変換前:"); System.out.println(str); str = str.replaceFirst("晴れ", "雨"); System.out.println("変換後:"); System.out.println(str); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd String_Class]$ javac testString6.java [xxxxxxxx@dddddddddd String_Class]$ java testString6 変換前: 今日の天気は晴れでした。明日の天気は晴れです。 変換後: 今日の天気は雨でした。明日の天気は晴れです。 [xxxxxxxx@dddddddddd String_Class]$ |
文字列に対して指定したパターンに一致する部分を全て他の文字で置き換えます。「replaceAll」メソッドを使います。 replaceAll public String replaceAll(String regex, String replacement)指定された正規表現に一致する、この文字列の各部分文字列に対し、指定された置換を実行します。 このフォームのメソッド呼び出し str.replaceAll(regex, repl) では、次の式と正確に同じ結果が得られます。 Pattern.compile(regex).matcher(str).replaceAll(repl) パラメータ: regex - この文字列との一致を判定する正規表現 戻り値: 結果として得られる String 例外: PatternSyntaxException - 正規表現の構文が無効な場合 例えば「今日の天気は晴れでした。明日の天気は晴れです。」と言う文字列に対して、「晴れ」を「雨」に変換する場合は次のようになります。 String str = "今日の天気は晴れでした。明日の天気は晴れです。"; str = str.replaceAll("晴れ", "雨");上記の結果、文字列「str」には「今日の天気は雨でした。明日の天気は雨です。」が格納されます。「晴れ」は対象の文字列の中に2回出現しますが、全てが置換の対象となります。 置換する対象の文字列には固定の文字列だけではなく正規表現を使ってより柔軟な指定が可能です。 では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。class testString7{ public static void main(String args[]){ String str = "今日の天気は晴れでした。明日の天気は晴れです。"; System.out.println("変換前:"); System.out.println(str); str = str.replaceAll("晴れ", "雨"); System.out.println("変換後:"); System.out.println(str); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd String_Class]$ javac testString7.java [xxxxxxxx@dddddddddd String_Class]$ java testString7 変換前: 今日の天気は晴れでした。明日の天気は晴れです。 変換後: 今日の天気は雨でした。明日の天気は雨です。 [xxxxxxxx@dddddddddd String_Class]$ |
|