在 Java 中從字串數組中刪除所有非字母字符
一、簡介
在 Java 中處理文字資料時,經常會遇到需要透過刪除非字母字元來清理字串的情況。此任務對於文字處理、使用者輸入驗證和資料清理至關重要。
在本教程中,我們將了解一些從數組中的字串中刪除非字母字元的最有效和最簡單的方法。我們將討論使用正規表示式、Stream API、 StringBuilder
和 Apache Commons Lang 等函式庫的技術。每種方法都將透過簡單的程式碼範例和測試進行說明。
2. 使用正規表示式
讓我們從正規表示式開始,從String
陣列中刪除所有非字母字元。它們讓我們定義匹配和替換字串中非字母字元的模式。
這種方法既靈活又易於實施:
public static String removeNonAlphabeticUsingRegex(String input) {
return input.replaceAll("[^a-zA-Z]", "");
}
我們使用正規表示式來識別並刪除輸入字串中的非字母字元。這裡的關鍵方法是replaceAll()
,它有兩個參數。第一個參數“[^a-zA-Z]” i
一個正則表達式模式,匹配任何非字母(大寫或小寫)的字符,而第二個參數“”用空字符串替換這些匹配的字符,有效地刪除它們。
接下來,我們來寫測試:
@Test
void givenMixedString_whenRemoveNonAlphabeticUsingRegex_thenReturnsOnlyAlphabeticCharacters() {
String[] inputArray = { "Hello123", "Java@Code", "Stack#Overflow" };
String[] expectedArray = { "Hello", "JavaCode", "StackOverflow" };
for (int i = 0; i < inputArray.length; i++) {
assertEquals(expectedArray[i], StringManipulator.removeNonAlphabeticUsingRegex(inputArray[i]));
}
}
3. 對流使用字元過濾
Java Streams 提供了一種處理元素序列的函數式程式設計方法。我們可以過濾字元以有效地刪除非字母字元:
public static String removeNonAlphabeticUsingStreams(String input) {
return input.chars()
.filter(Character::isLetter)
.mapToObj(c -> String.valueOf((char) c))
.collect(Collectors.joining());
}
在這裡,我們使用 Stream API 逐個字元處理輸入字串。本質上, input.chars(),
將字串轉換為字元流。然後, filter(Character::isLetter)
使用Character
類別中的isLetter()
方法過濾掉所有不是字母的字元。接下來, mapToObj(c -> String.valueOf( (char) c )
將過濾後的字元轉換回字串形式。最後, Collectors. joining()
將所有過濾後的字元收集到單一字串中。
讓我們透過測試來驗證該方法:
@Test
void givenMixedString_whenRemoveNonAlphabeticCharactersUsingStreams_thenReturnsOnlyAlphabeticCharacters() {
String[] inputArray = { "Stream123", "Functional!", "Lambda$Syntax" };
String[] expectedArray = { "Stream", "Functional", "LambdaSyntax" };
for (int i = 0; i < inputArray.length; i++) {
assertEquals(expectedArray[i], StringManipulator.removeNonAlphabeticUsingStreams(inputArray[i]));
}
}
4.使用StringBuilder
StringBuilder
提供了可變的字元序列以實現高效的字串建構。它對於在手動過濾字元時建立字串很有用:
public static String removeNonAlphabeticUsingStringBuilder(String input) {
StringBuilder sb = new StringBuilder();
for (char c : input.toCharArray()) {
if (Character.isLetter(c)) {
sb.append(c);
}
}
return sb.toString();
}
此方法採用手動方法使用StringBuilder
來過濾字元。使用StringBuilder
進行字串運算比重複使用+
運算子更有效。
首先,我們使用toCharArray().
然後我們循環遍歷每個字符,如果該字符是字母,我們使用 sb 將其附加到StringBuilder
中sb. append(c).
最後,我們使用sb.toString().
讓我們寫一個單元測試來驗證該方法:
@Test
void givenMixedString_whenRemoveNonAlphabeticCharactersUsingStringBuilder_thenReturnsOnlyAlphabeticCharacters() {
String[] inputArray = { "Builder@Example", "Remove123Chars", "Efficient*Code" };
String[] expectedArray = { "BuilderExample", "RemoveChars", "EfficientCode" };
for (int i = 0; i < inputArray.length; i++) {
assertEquals(
expectedArray[i], StringManipulator.removeNonAlphabeticUsingStringBuilder(inputArray[i]));
}
}
5. 使用 Apache Commons Lang
Apache Commons Lang 是一個實用程式庫,為常見任務提供有用的方法。它為StringUtils
類別提供了replacePattern()
方法,用於基於正規表示式的字串運算:
public static String removeNonAlphabeticWithApacheCommons(String input) {
return StringUtils.replacePattern(input, "[^a-zA-Z]", "");
}
我們使用 Apache Commons Lang 的replacePatttern()
方法,該方法需要輸入字串、要尋找的正規表示式模式以及將其替換為我們找到模式的String
。它使用正則表達式模式識別非字母字元並將其替換為空字串。
最後,讓我們來測試一下這個方法:
@Test
void givenMixedString_whenRemoveNonAlphabeticCharactersUsingpacheCommons_thenReturnsOnlyAlphabeticCharacters() {
String[] inputArray = { "Commons123Lang", "Apache@Utility", "String#Utils" };
String[] expectedArray = { "CommonsLang", "ApacheUtility", "StringUtils" };
for (int i = 0; i < inputArray.length; i++) {
assertEquals(
expectedArray[i], StringManipulator.removeNonAlphabeticWithApacheCommons(inputArray[i]));
}
}
六、結論
在本文中,我們快速探索了一些可用於從字串中刪除非字母字元的選項。這些選項包括使用正規表示式、使用 Stream API 進行篩選、迭代字串和使用StringBuilder,
最後使用 Apache Commons Lang 函式庫。
與往常一樣,本文的完整實作可以在 GitHub 上找到。