CodeGym /Java Blog /ランダム /Java String.split() メソッド
John Squirrels
レベル 41
San Francisco

Java String.split() メソッド

ランダム グループに公開済み
Java のString.splitメソッドについて、その機能と必要な理由について話しましょう。Java 文字列を分割することは推測に難しくありませんが、実際にはどのように機能するのでしょうか? メソッドの動作を深く掘り下げて、いくつかの明らかではない詳細について説明しましょう。同時に、String が実際にいくつの分割メソッドを持っているかを学びます。さあ行こう!

Java の String.split の説明と署名

Java では、splitメソッドは、正規表現を使用して定義された区切り文字を使用して文字列を部分文字列に分割します。メソッド シグネチャを提示して、ダイビングを始めましょう。

String[] split(String regex)
この署名から 2 つのことが明らかです。
  1. このメソッドは文字列の配列を返します。
  2. このメソッドには、 regexと呼ばれる文字列入力パラメータがあります。
上記の説明を分析しながら、これらを個別に分析してみましょう。
  1. このメソッドは文字列の配列を返します。

    宣言には、「Java では、splitメソッドは文字列を部分文字列に分割します。」という文言が含まれています。このメソッドは、これらの部分文字列を配列に収集し、それが戻り値になります。

  2. このメソッドには、 regexと呼ばれる文字列入力パラメータがあります。

    もう一度、「正規表現を使用して定義された区切り文字を使用して文字列を部分文字列に分割する」という説明を思い出してください。regex入力パラメータは元の文字列に適用される正規表現です。文字または文字の組み合わせが一致する場合、それらは区切り文字として扱われます。

Java の String.split() メソッド: 文字列を部分に分割する - 1

実際のJavaの分割

では、本題に近づいてみましょう。一連の単語があると想像してみましょう。たとえば、次のようになります。
ジャワが大好きです
文字列を単語に分割する必要があります。この文字列内の単語はスペースで区切られていることがわかります。この場合、スペース文字が区切り文字の最適な候補です。タスクを解決するためのコードは次のようになります。

public class Main {
    public static void main(String[] args) {
        String str = "I love Java";
        String[] words = str.split(" ");
        for (String word : words) {
            System.out.println(word);
        }
    }
}
mainメソッド の出力は次の行になります。
ジャワが大好きです
分割メソッドが どのように機能するかをさらにいくつか例を見てみましょう。
デリミタ メソッドの結果
「ジャワが大好きです」 「 」(スペース文字) { 「私」「愛」「ジャワ」 }
「192.168.0.1:8080」 「:」 { "192.168.0.1""8080" }
「赤、オレンジ、黄色」 「、」 { "赤""オレンジ""黄色" }
「赤、オレンジ、黄色」 "、" { "赤""オレンジ""黄色" }
上の表の最後の 2 行の違いに注目してください。最後から 2 番目の行では、区切り文字としてカンマが使用されます。その結果、文字列が分割されると、一部の単語の先頭にスペースが含まれます。最後の行では、区切り文字としてカンマとスペースを使用しました。そのため、結果の配列には先頭にスペースがある部分文字列が存在しませんでした。これは、適切な区切り文字を慎重に選択することがいかに重要であるかを示す微妙な詳細にすぎません。

先頭の区切り文字

これも重要なニュアンスです。元の文字列が区切り文字で始まる場合、結果の配列の最初の要素は空の文字列になります。たとえば、次のようになります。 元の文字列: " I love Java" 区切り文字: " " 結果の配列: { "", "I", "love", "Java" } ただし、元の文字列が区切り文字で終わっている場合は、 1 つから始める場合と結果は異なります。 元の文字列: "I love Java " 区切り文字: " " 結果の配列: { "I", "love", "Java"

public class Main {
    public static void main(String[] args) {
        print("I love Java".split(" "));
        print(" I love Java".split(" "));
        print("I love Java ".split(" "));
        print(" I love Java ".split(" "));
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}
mainメソッド出力は次のようになります。
[私、愛、Java] [私、愛、Java] [私、愛、Java] [私、愛、Java]
もう一度、元の文字列の最初の文字が区切り文字である場合、配列の最初の要素は空の文字列になるという事実に注目してください。

過負荷の兄弟

Stringクラスには、次のシグネチャを持つ別の分割メソッドが あります

String[] split(String regex, int limit)
このメソッドには追加の制限パラメーターがあり、正規表現パターンが元の文字列に適用される回数を決定します。以下の説明を参照してください。

限界 > 0

パターンの適用回数は -1 回に制限されます。さらに、返される配列の長さは、limitパラメーターの値を超えることはありません。配列の最後の要素は、区切り文字が見つかった最後の場所に続く文字列の部分になります。例:

public class Main {
    public static void main(String[] args) {
        print("I love Java".split(" ", 1));
        print("I love Java".split(" ", 2));
        /*
         Output: 
         [I love Java]
         [I, love Java]
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}

制限 < 0

区切り文字の正規表現は、文字列に可能な限り何度も適用されます。結果の配列は任意の長さにすることができます。例:

public class Main {
    public static void main(String[] args) {
        // Note the space at the end of the string
        print("I love Java ".split(" ", -1));
        print("I love Java ".split(" ", -2));
        print("I love Java ".split(" ", -12));
        /*
         Output:
        [I, love, Java, ]
        [I, love, Java, ]
        [I, love, Java, ]
        
        Please note that the last element of the array is
        an empty string. This is caused by the whitespace
        at the end of the original string. 
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}

制限 = 0

制限< 0の場合と同様に、区切り文字パターンは可能な限り何度でも文字列に適用されます。最終的な配列は任意の長さにすることができます。最後の要素が空の文字列の場合、それらは最終的な配列から破棄されます。例:

public class Main {
    public static void main(String[] args) {
        // Note the space at the end of the string
        print("I love Java ".split(" ", 0));
        print("I love Java ".split(" ", 0));
        print("I love Java ".split(" ", 0));
        /*
         Output:
        [I, love, Java]
        [I, love, Java]
        [I, love, Java]
        Note the absence of empty strings at the end of the arrays
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}
Splitメソッド の 1 パラメーター バージョンの実装を覗いてみると、このメソッドはオーバーロードされた兄弟に似ていますが、2 番目の引数が 0 に設定されていることがわかります。

    public String[] split(String regex) {
        return split(regex, 0);
    }

さまざまな例

実際の実務では、特定のルールに従って文字列が生成されることがあります。このような文字列はどこからでもプログラムに入る可能性があります。
  • サードパーティのサービスから。
  • 当社のサーバーに送信されたリクエストから。
  • 構成ファイルから。
  • 等々。
このような状況では、プログラマは通常、「ゲームのルール」を知っています。プログラマが、次のパターンに従って保存されたユーザー情報を扱っていることを知っているとします。
user_id|user_login|user_email
例としていくつかの具体的な値を取り上げてみましょう。
135|ベンダー|bender@gmail.com
プログラマのタスクは、ユーザーに電子メールを送信するメソッドを作成することだとします。プログラマーは、上記の形式で記録されたユーザー データにアクセスできます。これから分析を続けるサブタスクは、電子メール アドレスを残りのユーザー データから分離する方法です。これは、分割メソッドが役立つ1 つの例です。結局のところ、ユーザー データ テンプレートを見ると、残りの部分からユーザーの電子メール アドレスを抽出するのは、splitメソッドを呼び出して文字列を分割するだけで簡単であることがわかります。この場合、電子メール アドレスは、結果の配列の最後の要素に含まれます。以下は、ユーザー データを含む文字列を取得し、ユーザーの電子メール アドレスを返すメソッドの例です。簡単にするために、データ文字列が常に必要な形式であるとします。

public class Main {
    public static void main(String[] args) {
        String userInfo = "135|bender|bender@gmail.com";
        System.out.println(getUserEmail(userInfo));
        // Output: bender@gmail.com
    }

    static String getUserEmail(String userInfo) {
        String[] data = userInfo.split("\\|");
        return data[2]; // or data[data.length - 1]
    }
}
区切り文字「\\|」に注意してください。。正規表現では「|」は特別な意味を持つ特殊文字なので、それを通常の文字 (つまり、元の文字列で検索したいもの) として使用したい場合は、2 つのバックスラッシュで文字をエスケープする必要があります。別の例を考えてみましょう。次のような構造の注文情報があるとします。
商品番号_1,商品名_1,商品価格_1;商品番号_2,商品名_2,商品価格_2;...;商品番号_n,商品名_n,商品価格_n
あるいは、いくつかの特定の値を採用することもできます。
1,キュウリ,2.39;2,トマト,1.89;3,ベーコン,4.99
私たちの仕事は、注文の合計コストを計算することです。ここでは、分割メソッドを数回適用する必要があります。最初のステップは、「;」を使用して文字列を分割することです。構成要素に分割するための区切り文字として使用します。結果として得られる各部分文字列には、後で処理できる個別の製品に関する情報が保持されます。次に、製品ごとに、対応する情報を「,」記号を使用して分割します。結果の文字列配列から特定のインデックスを持つ要素 (製品価格が格納されている要素) を取得し、それを数値形式に変換し、注文の合計コストを集計します。これらすべての計算を行うメソッドを書いてみましょう。

public class Main {
    public static void main(String[] args) {
        String orderInfo = "1,cucumbers,2.39;2,tomatoes,1.89;3,bacon,4.99";
        System.out.println(getTotalOrderAmount(orderInfo));
        // Output: 9.27
    }

    static double getTotalOrderAmount(String orderInfo) {
        double totalAmount = 0d;
        final String[] items = orderInfo.split(";");

        for (String item : items) {
            final String[] itemInfo = item.split(",");
            totalAmount += Double.parseDouble(itemInfo[2]);
        }

        return totalAmount;
    }
}
この方法がどのように機能するかを自分で理解できるかどうかを確認してください。これらの例に基づいて、分割メソッドは、文字列としてフォーマットされたデータがあり、そこから特定のより具体的な情報を抽出する必要がある場合に使用されると言えます。

まとめ

Stringクラスのsplitメソッドを調べました。これは、特別な区切り文字を使用して文字列を構成部分に分割する必要がある場合に必要なものです。このメソッドは、文字列 (元の文字列を構成する部分文字列) の配列を返します。区切り文字を表す正規表現を受け入れます。この方法のさまざまな微妙な点を調べました。
  • 先頭の区切り文字。
  • 2 つのパラメーターを持つオーバーロードされた兄弟。
また、分割法を使用して仮説的ではあるが非常に現実的な問題を解決する実際の状況をモデル化することも試みました。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION