根據字元的最後一次出現拆分字串
1. 概述
String操作是 Java 程式設計中的關鍵技能。一項常見任務是根據特定字元的最後一次出現來拆分String 。
在這個快速教程中,我們將探索實現這一目標的不同方法。
2.問題介紹
我們的目標是根據指定字元的最後一次出現將String分成兩部分。一個例子可以快速解釋它。
假設我們有一個String輸入:
static final String INPUT1 = "abc@efg@xyz";
現在,我們想用最後一個「 @ 」字元分割String ,並獲得一個包含兩個元素的String陣列:
static final String[] EXPECTED1 = new String[] { "abc@efg", "xyz" };
此範例顯示輸入有兩個“ @ ”字符,但我們必須僅用最後一個“ @ ”將其分割。
有時,輸入僅包含一個“ @ ”,且該字元位於開頭,例如:
static final String INPUT2 = "@abc";
在這種情況下,我們期望有一個包含兩個元素的String陣列。一個是空String ,另一個是 ' @ ' 之後的子字串:
static final String[] EXPECTED2 = new String[] { "", "abc" };
同樣,唯一的“ @ ”字元可以位於輸入的最末尾:
static final String INPUT3 = "abc@";
static final String[] EXPECTED3 = new String[] { "abc", "" };
最後,還有一種特殊情況:輸入不包含“ @ ”字元。在這種情況下,結果String陣列應該只包含一個元素:輸入本身。
static final String INPUT4 = "abc";
static final String[] EXPECTED4 = new String[] { "abc" };
在本教程中,我們將介紹兩種解決問題的方法。為簡單起見,我們將在實作中跳過空檢查。
接下來,讓我們深入了解實作。
3.使用lastIndexOf()
解決問題的一個直接方法是,首先找到**輸入String中最後一個「 @ 」的位置,然後取得最後一個「 @ 」字元前後的兩個子字串。**
Java的lastIndexOf()和substring()方法可以幫助我們實現我們的目標:
String[] splitByLastOccurrence(String input, char character) {
int idx = input.lastIndexOf(character);
return new String[] { input.substring(0, idx), input.substring(idx + 1) };
}
此實作適用於大多數輸入。但是,如果輸入不包含character ,例如我們的INPUT4 ,則會失敗。這是因為idx將為-1 ,而substring(0, -1)會引發異常。
因此,我們必須處理這種特殊情況,以使該方法適用於所有輸入String :
String[] splitByLastOccurrence(String input, char character) {
int idx = input.lastIndexOf(character);
if (idx < 0) {
return new String[] { input };
}
return new String[] { input.substring(0, idx), input.substring(idx + 1) };
}
接下來,讓我們建立一個測試來驗證splitByLastOccurrence()是否如預期般運作:
String[] result1 = splitByLastOccurrence(INPUT1, '@');
assertArrayEquals(EXPECTED1, result1);
String[] result2 = splitByLastOccurrence(INPUT2, '@');
assertArrayEquals(EXPECTED2, result2);
String[] result3 = splitByLastOccurrence(INPUT3, '@');
assertArrayEquals(EXPECTED3, result3);
String[] result4 = splitByLastOccurrence(INPUT4, '@');
assertArrayEquals(EXPECTED4, result4);
測試表明該方案適用於所有場景。
4. 使用split()
String.split()方法是解決String分割問題的便利工具。接下來,讓我們建立正規表示式模式來匹配最後一個「 @ 」字符,然後我們可以使用split()解決我們的問題。
正向前瞻性可以幫助我們配對最後一個「 @ 」字元:「 @(?=[^@]*$) 」。此模式透過確保後面沒有其他「 @ 」字元來有效地匹配String中的最後一個「 @ 」。
接下來,讓我們看看是否可以使用split()和此正規表示式模式來獲得預期結果:
String regex = "@(?=[^@]*$)";
String[] result1 = INPUT1.split(regex);
assertArrayEquals(EXPECTED1, result1);
String[] result2 = INPUT2.split(regex);
assertArrayEquals(EXPECTED2, result2);
String[] result3 = INPUT3.split(regex);
assertArrayEquals(new String[] { "abcd" }, result3);
String[] result4 = INPUT4.split(regex);
assertArrayEquals(EXPECTED4, result4);
正如我們所看到的, split()方法 適用於INPUT1, INPUT2,和INPUT4 。然而,當我們split( ) INPUT3 (“abc@”),結果陣列只包含一個元素。這是因為如果我們不將limit參數傳遞給split(), split()會將零當作limit 。因此, split()會丟棄尾隨的空String 。
我們可以將limit=2傳遞給split()來解決這個問題:
String regex = "@(?=[^@]*$)";
String[] result1 = INPUT1.split(regex, 2);
assertArrayEquals(EXPECTED1, result1);
String[] result2 = INPUT2.split(regex, 2);
assertArrayEquals(EXPECTED2, result2);
String[] result3 = INPUT3.split(regex, 2);
assertArrayEquals(EXPECTED3, result3);
String[] result4 = INPUT4.split(regex, 2);
assertArrayEquals(EXPECTED4, result4);
如測試所示,當我們將2作為limit傳遞給split()時,它適用於所有情況。
5. 結論
在本文中,我們透過範例探索了兩種根據字元的最後一次出現來分割String的方法。透過應用這些方法,我們可以有效地處理各種場景,確保String操作任務的程式碼健壯。
與往常一樣,範例的完整原始程式碼可在 GitHub 上取得。