JavaRush /Java Blog /Random-TW /Java中的Split方法:將字串分成幾部分

Java中的Split方法:將字串分成幾部分

在 Random-TW 群組發布
讓我們來談談字串分割方法:它的作用以及為什麼需要它。很容易猜到它是分割字串的,但是它在實踐中是如何運作的呢?讓我們仔細看看方法是如何運作的,並討論一些不明顯的細節,同時找出String類別中實際上有多少個split方法。我們走吧!

Java String.split 的定義與簽名

Java 中的split方法使用正規表示式指定的分隔符號將字串拆分為子字串。讓我們給出方法簽名並開始我們的潛水:
String[] split(String regex)
從簽名中可以清楚看出兩點:
  1. 該方法傳回一個字串數組。
  2. 此方法採用正規表示式字串作為參數。
讓我們根據上面給出的定義分別看看每件事。
  1. 該方法傳回一個字串數組。

    定義包含以下內容:“ Java 中的split方法將字串拆分為子字串。” 這些子字串由該方法收集到一個陣列中並表示其傳回值。

  2. 此方法採用正規表示式字串作為參數。

    再次記住定義:“使用正則表達式指定的分隔符將字串拆分為子字串。” 接受的regex參數是套用於來源字串並匹配來源字串中的分隔符號(或字元組合)的正規表示式模式。

Java中的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方法 的輸出將是以下幾行:
我愛Java
讓我們來看幾個split方法如何運作的範例:
分隔符 該方法的結果
“我愛Java” “”(空格字元) { “我”“愛”“Java” }
“192.168.0.1:8080” “:” { “192.168.0.1”“8080” }
“紅、橙、黃” “,” { “紅色”“橙色”“黃色” }
“紅、橙、黃” “,” { “紅色”“橙色”“黃色” }
請注意上表中最後兩行之間的差異。在倒數第二行中,分隔符號是逗號,因此該行被分割成某些單字具有前導空格。在最後一行中,我們使用逗號和空格字元作為分隔符號。因此,產生的陣列不包含任何帶有前導空格的行。這只是一個小細節,顯示仔細選擇正確的分離器是多麼重要。

前導分隔符

還有一個更重要的細微差別。如果來源字串以分隔符號開頭,則結果數組的第一個元素將為空字串。在範例中,它看起來像這樣: 來源字串:"I love Java" 分隔符號:" " 結果陣列: { "" , "I" , "love" , "Java" } 但如果來源字串以分隔符結尾並且不開始,結果會不同: 原始字串:“I love Java” 分隔符號:“” 結果數組:{ "I" , "love" , "Java" } 我們在程式碼中查看split方法的變體在來源字串的末尾和/或開頭帶有分隔符號:
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類別還有另一個具有以下簽名的 split方法:
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

limit < 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));
    }
}
如果我們查看帶有一個參數的split方法 的實現,我們會發現該方法使用第二個參數為零來呼叫其重載的同級方法:
public String[] split(String regex) {
    return split(regex, 0);
}

各種例子

在工作實務中,有時會出現依照某一規則編制的線路。該行可以從任何地方「進入」我們的程式:
  • 來自第三方服務;
  • 來自對我們伺服器的請求;
  • 來自設定檔;
  • ETC。
通常在這種情況下,程式設計師知道“遊戲規則”。假設程式設計師知道他擁有有關使用者的信息,這些資訊是根據以下模式儲存的:
使用者 ID|使用者登入名稱|使用者電子郵件
例如,我們取具體值:
135|bender|bender@gmail.com
現在程式設計師面臨的任務是:撰寫一個向使用者發送電子郵件的方法。他可以使用以上述格式記錄的有關使用者的信息。那麼,我們將繼續分析的子任務是將電子郵件地址與使用者的一般資訊隔離。這是split方法有用的範例。畢竟,如果我們查看模板,我們就會明白,為了從所有資訊中提取使用者的電子郵件地址,我們只需要使用 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]
    }
}
注意分隔符號:“\\|” 。因為在正規表示式中“|” - 這是一個與某些邏輯相關的特殊字元;為了將其用作常規字元(我們想要在來源字串中找到的字元),我們需要使用兩個反斜線轉義該字元。讓我們來看另一個例子。假設我們有一個訂單的訊息,其格式大致如下:
商品編號_1,商品名稱_1,商品價格_1;商品編號_2,商品名稱_2,商品價格_2;...;商品編號_n,商品名稱_n,商品價格_n
或讓我們取具體值:
1、黃瓜,20.05;2、西紅柿,123.45;3、野兔,0.50
我們面臨著計算訂單總成本的任務。這裡我們將不得不多次使用split方法。第一步是透過“;”符號將字串拆分為其組成部分。然後,在每個這樣的部分中,我們將獲得有關單一產品的信息,以便我們將來進行處理。然後,在每個產品中,我們將使用“,”符號分隔訊息,並從結果數組中取出具有特定索引的元素(其中存儲價格),將其轉換為數字形式並編譯最終成本的訂單。讓我們寫一個方法來計算所有這些:
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方法。需要使用特殊的分隔符號將字串拆分為其組成部分。該方法傳回一個字串數組(字串的組成部分)。接受查找分隔符號的正規表示式。我們研究了這種方法的各種微妙之處:
  • 前導分隔符號;
  • 有兩個參數的超載兄弟。
我們也嘗試模擬一些「現實生活」的情況,使用split方法來解決雖然虛構但非常現實的問題。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION