讓我們談談 Java 的String.split方法:它的作用以及為什麼需要它。不難猜到它拆分了一個 Java 字符串,但它在實踐中是如何工作的呢?讓我們深入研究該方法的操作並討論一些不明顯的細節。同時,我們將了解String實際有多少種拆分方法。我們走吧!
請注意上表中最後兩行之間的差異。在倒數第二行中,使用逗號作為分隔符。結果,當字符串被拆分時,一些單詞有前導空格。在最後一行中,我們使用逗號和空格作為分隔符。這就是結果數組中沒有帶前導空格的子字符串的原因。這只是一個微妙的細節,它表明仔細選擇正確的分隔符是多麼重要。
Java 的 String.split 的描述和簽名
在 Java 中,split方法使用使用正則表達式定義的定界符將字符串拆分為子字符串。讓我們展示方法簽名並開始我們的潛水:
String[] split(String regex)
從簽名中可以清楚地看出兩件事:
- 該方法返回一個字符串數組。
- 該方法有一個名為regex 的字符串輸入參數。
-
該方法返回一個字符串數組。
聲明包含以下文字:“在 Java 中,split方法將字符串拆分為子字符串。” 該方法將這些子字符串收集到一個數組中,該數組成為返回值。
-
該方法有一個名為regex 的字符串輸入參數。
再次回憶一下描述:“使用正則表達式定義的定界符將字符串拆分為子字符串。” regex輸入參數是應用於原始字符串的正則表達式。當字符或字符組合匹配時,它們被視為分隔符。

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方法 的輸出將是以下幾行:
我愛爪哇
讓我們再看幾個split方法如何工作的例子:
細繩 | 定界符 | 方法的結果 |
“我愛爪哇” | " "(空格字符) | { “我”,“愛”,“Java” } |
“192.168.0.1:8080” | “:” | { "192.168.0.1" , "8080" } |
“紅、橙、黃” | "," | { “紅色” , “橙色” , “黃色” } |
“紅、橙、黃” | ", " | { “紅色” , “橙色” , “黃色” } |
前導分隔符
這是另一個重要的細微差別。如果原始字符串以分隔符開頭,則結果數組的第一個元素將為空字符串。例如,它看起來像這樣:原始字符串:“我愛 Java” 分隔符:“” 結果數組:{“”,“I”,“love”,“Java”} 但是如果原始字符串以分隔符結尾而不是而不是以一個開頭,則結果將不同:原始字符串:“我愛 Java” 分隔符:“” 結果數組:{“我”,“愛”,“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));
}
}
主要方法的輸出將是這樣的:
[我,愛,Java] [,我,愛,Java] [,我,愛,Java] [,我,愛,Java]
再次將注意力轉向以下事實:當原始字符串中的第一個字符是分隔符時,結果是數組中的第一個元素將是一個空字符串。
超載兄弟姐妹
String類有另一個具有以下簽名的 split方法:
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
與limit < 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方法 的單參數版本的實現,那麼我們可以看到它就像它的重載兄弟,但第二個參數設置為零:
public String[] split(String regex) {
return split(regex, 0);
}
各種例子
在現實世界的實踐中,有時會發生我們有根據某些規則生成的字符串。這樣的字符串可能從任何地方進入我們的程序:- 來自第三方服務;
- 來自發送到我們服務器的請求;
- 來自配置文件;
- 等等。
user_id|user_login|user_email
我們以一些具體的值為例:
135|本德爾|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]
}
}
注意分隔符:“\\|” . 在正則表達式中,“|” 是一個具有特殊含義的特殊字符,所以如果我們想用它作為一個普通字符(即我們想在原始字符串中查找的內容),那麼我們需要用兩個反斜杠對字符進行轉義。考慮另一個例子。假設我們有結構如下的訂單信息:
item_number_1,item_name_1,item_price_1;item_number_2,item_name_2,item_price_2;...;item_number_n,item_name_n,item_price_n
或者我們甚至可以採用一些特定的值:
1、黃瓜2.39;2、西紅柿1.89;3、培根4.99
我們的任務是計算訂單的總成本。在這裡,我們將不得不多次應用split方法。第一步是使用“;”分割字符串 作為分隔符,以便將其分解成其組成部分。然後每個結果子字符串將包含有關單獨產品的信息,我們可以稍後處理這些信息。然後,對於每個產品,我們將使用“,”符號拆分相應的信息。我們將從生成的字符串數組中獲取具有特定索引(存儲產品價格的索引)的元素,將其轉換為數字形式,併計算訂單的總成本。讓我們編寫一個方法來完成所有這些計算:
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;
}
}
看看你是否能自己弄清楚這個方法是如何工作的。基於這些示例,我們可以說當我們將一些數據格式化為字符串時使用split方法,我們需要從中提取某些更具體的信息。
概括
我們檢查了String類的split方法。當您必須藉助特殊定界符將字符串拆分為其組成部分時,這正是您所需要的。該方法返回一個字符串數組(組成原始字符串的子字符串)。它接受一個正則表達式,其匹配代表分隔符。我們檢查了這種方法的各種微妙之處:- 前導分隔符;
- 它的重載兄弟有兩個參數。
GO TO FULL VERSION