String 分割メソッド について話しましょう。その機能とそれが必要な理由について説明します。文字列を分割することは容易に推測できますが、実際にはどのように機能するのでしょうか? メソッドがどのように動作するかを詳しく見て、いくつかの明らかではない詳細について説明します。同時に、Stringクラスに実際に分割メソッドがいくつあるかを調べてみましょう。さあ行こう!
上の表の最後の 2 行の違いに注目してください。最後から 2 番目の行では区切り文字がカンマであるため、一部の単語の先頭にスペースが入るように行が分割されます。最後の行では、区切り文字としてカンマとスペース文字を使用しました。したがって、結果の配列には先頭にスペースのある行は含まれませんでした。これは、正しいセパレータを慎重に選択することがいかに重要であるかを示すほんの小さな詳細です。
Java String.split の定義と署名
Java のSplitメソッドは、正規表現で指定された区切り文字を使用して文字列を部分文字列に分割します。メソッドの署名を与えて、ダイビングを始めましょう。String[] split(String regex)
この署名から 2 つのことが明らかです。
- このメソッドは文字列の配列を返します。
- このメソッドはパラメータとして正規表現文字列を受け取ります。
- このメソッドは文字列の配列を返します。
この定義には、「 Java のSplitメソッドは文字列を部分文字列に分割します。」という文言が含まれています。これらの部分文字列はメソッドによって配列に収集され、その戻り値を表します。
- このメソッドはパラメータとして 正規表現文字列を受け取ります。
もう一度、「正規表現を使用して指定された区切り文字を使用して文字列を部分文字列に分割する」という定義を思い出してください。受け入れられるregexパラメータは、ソース文字列に適用され、ソース文字列内の区切り文字 (または文字の組み合わせ) と一致する正規表現パターンです。
実際に分割する
さて、本題に入りましょう。単語を含む文字列があると想像してみましょう。たとえば、次のようになります。
ジャワが大好きです
文字列を単語に分割する必要があります。この行では、単語がスペースで区切られていることがわかります。この場合、スペースはセパレータの役割の理想的な候補です。この問題を解決するためのコードは次のようになります。
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" } |
「赤、オレンジ、黄色」 | 「、」 | { "赤"、"オレンジ"、"黄色" } |
「赤、オレンジ、黄色」 | "、" | { "赤"、"オレンジ"、"黄色" } |
先頭の区切り文字
もう 1 つ重要なニュアンスがあります。ソース文字列が区切り文字で始まる場合、結果の配列の最初の要素は空の文字列になります。例では、次のようになります。 ソース文字列: "I love Java" 区切り文字: " " 結果の配列: { "" , "I" , "love" , "Java" } ただし、ソース文字列が区切り文字で終わっている場合が始まらない場合、結果は異なります: ソース文字列: "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回が適用されます。この場合、配列の長さは制限値を超えることはありません。配列の最後の要素は、最後に見つかった区切り文字に続く文字列の部分になります。例: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) {
// Notice the space at the end of the line
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, ]
Note that the last element of the array is
an empty string, resulting from the space
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) {
// Notice the space at the end of the line
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));
}
}
引数を 1 つ指定したSplitメソッド の実装を見ると、このメソッドが 2 番目の引数 0 を指定してオーバーロードされた兄弟を呼び出していることがわかります。
public String[] split(String regex) {
return split(regex, 0);
}
さまざまな例
仕事の現場では、あるルールに従って一行を編集することがあります。この行はどこからでもプログラムに「入る」ことができます。- サードパーティのサービスから。
- 当社のサーバーへのリクエストから;
- 構成ファイルから。
- 等
user_id|user_login|user_email
たとえば、具体的な値を考えてみましょう。
135|ベンダー|bender@gmail.com
そしてプログラマーは、ユーザーに電子メールを送信するメソッドを作成するという課題に直面しています。上記の形式で記録されたユーザーに関する情報を自由に使用できます。さて、分析を続けるサブタスクは、ユーザーに関する一般情報から電子メール アドレスを分離することです。これは、分割メソッドが役立つ一例です。結局のところ、テンプレートを見ると、すべての情報からユーザーの電子メール アドレスを抽出するには、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、キュウリ、20.05; 2、トマト、123.45; 3、ノウサギ、0.50
私たちは注文の総コストを計算するという課題に直面しています。ここでは、分割メソッドを数回使用する必要があります。最初のステップは、文字列を「;」記号で構成部分に分割することです。そして、そのような各部分には、将来的に処理できる個々の製品に関する情報が含まれます。次に、各製品内で「,」記号を使用して情報を区切って、結果の配列から特定のインデックスを持つ要素 (価格が格納されている) を取得し、それを数値形式に変換して、最終的なコストをコンパイルします。注文の。これらすべてを計算するメソッドを書いてみましょう。
public class Main {
public static void main(String[] args) {
String orderInfo = "1, cucumbers, 20.05; 2, tomatoes, 123.45; 3, hares, 0.50";
System.out.println(getTotalOrderAmount(orderInfo));
// Output: 144.0
}
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;
}
}
この方法がどのように機能するかを自分で理解してみてください。これらの例に基づいて、 splitメソッドは、文字列形式の情報があり、そこからさらに具体的な情報を抽出する必要がある場合に使用されると 言えます。
結果
StringクラスのSplitメソッドを調べました。特別な区切り文字を使用して文字列をその構成部分に分割する必要があります。このメソッドは、文字列の配列 (文字列の構成要素) を返します。区切り文字を検索する正規表現を受け入れます。この方法のさまざまな微妙な点を調べました。- 先頭の区切り文字。
- 2 つの引数を持つオーバーロードされた兄弟。
GO TO FULL VERSION