Java 中按空格拆分字符串的指南
一、概述
在 Java 中, String
可以看作是多個子字符串的串聯。此外,通常使用空格作為分隔符來構建子字符串集合併將其存儲到單個字符串中。
在本教程中,我們將學習如何通過空格、製表符或換行符等空白字符拆分String
。
2. String
示例
首先,我們需要構建一些String
樣本,我們可以將其用作按空格拆分的輸入。因此,讓我們首先將一些空白字符定義為String
常量,以便我們可以方便地重用它們:
String SPACE = " ";
String TAB = "
";
String NEW_LINE = "\n";
接下來,讓我們使用它們作為分隔符來定義包含不同水果名稱的String
樣本:
String FRUITS_TAB_SEPARATED = "Apple" + TAB + "Banana" + TAB + "Mango" + TAB + "Orange";
String FRUITS_SPACE_SEPARATED = "Apple" + SPACE + "Banana" + SPACE + "Mango" + SPACE + "Orange";
String FRUITS_NEWLINE_SEPARATED = "Apple" + NEW_LINE + "Banana" + NEW_LINE + "Mango" + NEW_LINE + "Orange";
最後,我們還要編寫verifySplit()
方法,我們將重複使用該方法來驗證按空白字符拆分這些字符串的預期結果:
private void verifySplit(String[] fruitArray) {
assertEquals(4, fruitArray.length);
assertEquals("Apple", fruitArray[0]);
assertEquals("Banana", fruitArray[1]);
assertEquals("Mango", fruitArray[2]);
assertEquals("Orange", fruitArray[3]);
}
現在我們已經構建了輸入字符串,我們準備探索不同的策略來拆分這些字符串並驗證拆分。
3. 使用分隔符正則表達式拆分
String
類的split()
方法是拆分字符串的事實標準。它接受一個定界符正則表達式並將拆分生成一個String
數組:
String[] split(String regex);
首先,讓我們用一個空格字符拆分FRUITS_SPACE_SEPARATED
String
:
@Test
public void givenSpaceSeparatedString_whenSplitUsingSpace_shouldGetExpectedResult() {
String fruits = FRUITS_SPACE_SEPARATED;
String[] fruitArray = fruits.split(SPACE);
verifySplit(fruitArray);
}
同樣,我們可以分別使用TAB
和NEW_LINE
作為分隔符正則表達式來拆分FRUITS_TAB_SEPARATED
和FRUITS_NEWLINE_SEPARATED
。
接下來,讓我們嘗試對空格、製表符和換行符使用更通用的正則表達式,並使用相同的正則表達式拆分所有字符串樣本:
@Test
public void givenWhiteSpaceSeparatedString_whenSplitUsingWhiteSpaceRegex_shouldGetExpectedResult() {
String whitespaceRegex = SPACE + "|" + TAB + "|" + NEW_LINE;
String[] allSamples = new String[] { FRUITS_SPACE_SEPARATED, FRUITS_TAB_SEPARATED, FRUITS_NEWLINE_SEPARATED };
for (String fruits : allSamples) {
String[] fruitArray = fruits.split(whitespaceRegex);
verifySplit(fruitArray);
}
}
到目前為止,看起來我們做對了!
最後,讓我們通過使用本身代表各種空白字符的空白元字符 ( \s
) 來簡化我們的方法:
@Test
public void givenNewlineSeparatedString_whenSplitUsingWhiteSpaceMetaChar_shouldGetExpectedResult() {
String whitespaceMetaChar = "\\s";
String[] allSamples = new String[] { FRUITS_SPACE_SEPARATED, FRUITS_TAB_SEPARATED, FRUITS_NEWLINE_SEPARATED };
for (String fruits : allSamples) {
String[] fruitArray = fruits.split(whitespaceMetaChar);
verifySplit(fruitArray);
}
}
我們應該注意,使用\s
元字符比為空白創建自定義正則表達式更方便和可靠。此外,如果我們的輸入字符串可以有多個空白字符作為分隔符,那麼我們可以使用\\s+
而不是\\s
而無需更改其餘代碼。
4. 使用StringTokenizer
拆分
用空格分割字符串是一種常見的用例,以至於許多 Java 庫公開了一個接口來實現這一點,而無需明確指定分隔符。在本節中,讓我們學習如何使用StringTokenizer
來解決這個用例:
@Test
public void givenSpaceSeparatedString_whenSplitUsingStringTokenizer_shouldGetExpectedResult() {
String fruits = FRUITS_SPACE_SEPARATED;
StringTokenizer tokenizer = new StringTokenizer(fruits);
String[] fruitArray = new String[tokenizer.countTokens()];
int index = 0;
while (tokenizer.hasMoreTokens()) {
fruitArray[index++] = tokenizer.nextToken();
}
verifySplit(fruitArray);
}
我們可以看到我們沒有提供任何分隔符,因為StringTokenizer
默認使用空白分隔符。此外,代碼遵循迭代器設計模式,其中hasMoreTokens()
方法決定循環終止條件,而nextToken()
給出下一個 split 。
此外,我們應該注意到我們使用了countTokens()
方法來預先確定拆分的數量。但是,如果我們想在一個序列中一次一個地使用生成的拆分,則不需要這樣做。通常,當輸入字符串很長並且我們希望立即進行下一次拆分而不需要等待整個拆分過程完成時,我們應該使用這種方法。
5. 使用 Apache Commons 拆分
org.apache.commons.lang3
包的StringUtils
類提供了一個用於拆分String
的split()
實用方法。與StringTokenizer
類一樣,它使用空格作為分割字符串的默認分隔符:
public static String[] split(String str);
讓我們首先在項目的pom.xml
文件中添加commons-lang3
依賴項:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
接下來,讓我們通過拆分String
樣本來查看實際效果:
@Test
public void givenWhiteSpaceSeparatedString_whenSplitUsingStringUtils_shouldGetExpectedResult() {
String[] allSamples = new String[] { FRUITS_SPACE_SEPARATED, FRUITS_TAB_SEPARATED, FRUITS_NEWLINE_SEPARATED };
for (String fruits : allSamples) {
String[] fruitArray = StringUtils.split(fruits);
verifySplit(fruitArray);
}
}
使用StringUtils
類的split()
實用程序方法的優點之一是調用者不必顯式執行 null 檢查。那是因為split()
方法優雅地處理了這個問題。讓我們繼續看看實際效果:
@Test
public void givenNullString_whenSplitUsingStringUtils_shouldReturnNull() {
String fruits = null;
String[] fruitArray = StringUtils.split(fruits);
assertNull(fruitArray);
}
正如預期的那樣,該方法為null
輸入返回null
值。
六,結論
在本教程中,我們學習了多種按空格拆分字符串的方法。此外,我們還注意到與某些策略相關的優勢和推薦的最佳實踐。
與往常一樣,本教程的完整源代碼可在 GitHub 上獲得。