如何從字串中刪除數字
1. 概述
在本教程中,我們將探索從Strings中刪除數字的各種方法。
我們將從正規表示式開始,示範如何利用String類別的replaceAll()方法以及如何使用Pattern和Matcher類別。我們也將介紹 Apache Commons Lang 庫如何處理此任務。除了正規表示式之外,我們還將研究使用迴圈和StringBuilder更手動的方法。最後,我們將深入研究如何使用Character Streams來實現此目的。
2. 使用正規表示式
正規表示式或正規表示式提供了一種強大而靈活的方式來搜尋、匹配和操作文字。 java.util.regex套件支援正規表示式。正規表示式提供了一種高效、簡潔的解決方案,用於從Strings.
要從String中刪除數字,我們需要一個識別數字的正規表示式模式。在正規表示式中, \d符合任何數字 (0-9)。透過使用\d ,我們可以定位String中的所有數字並將它們替換為空String 。
為了保持程式碼的簡潔和可讀性,我們將使用常數來表示常見值,例如輸入String 、正規表示式模式和預期結果:
static final String INPUT_STRING = "M3a9n2y n8u6m7b5e4r0s1";
static final String EXPECTED_STRING = "Many numbers";
static final String DIGIT_REGEX = "\\d";
讓我們從正規表達式方法開始。
2.1.使用String的replaceAll()
String類別的replaceAll()方法允許取代String中與給定正規表示式模式相符的部分。透過為replaceAll()提供正規表示式模式,我們可以根據需要有效地修改String :
@Test
void whenUsingReplaceAll_thenGetExpectedResult() {
String updatedString = INPUT_STRING.replaceAll(DIGIT_REGEX, "");
assertEquals(EXPECTED_STRING, updatedString);
}
此範例示範了使用具有正規表示式模式的replaceAll()方法來操作Strings是多麼簡單。
2.2.使用Pattern和Matcher
java.util.regex套件中的Pattern和Matcher類別提供了用於處理正規表示式的高階且靈活的 API。
透過使用這些類,我們可以使用Pattern編譯正規表示式模式,並使用Matcher將其應用到String ,然後可以使用 Matcher 執行各種操作,例如查找、替換或拆分文字:
@Test
void whenUsingPatternAndMatcher_thenGetExpectedResult() {
Pattern pattern = Pattern.compile(DIGIT_REGEX);
Matcher matcher = pattern.matcher(INPUT_STRING);
String updatedString = matcher.replaceAll("");
assertEquals(EXPECTED_STRING, updatedString);
}
前面的範例說明了使用Pattern和Matcher類別進行正規表示式操作的強大功能。透過了解如何使用這些類別編譯和應用正規表示式模式,我們可以執行更複雜和更精確的String操作。
2.3.使用 Apache Commons Lang
Apache Commons Lang 為java.lang套件提供了實用程式類別庫,增強了核心 Java 功能。其中一個類別RegexUtils提供了用於正規表示式操作的有用方法。
要使用 Apache Commons Lang,我們在pom.xml檔案中新增commons-lang3依賴項:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version>
</dependency>
要使用 Apache Commons Lang 從String中刪除數字,我們可以結合使用RegexUtils類別和正規表示式模式:
@Test
void whenUsingApacheCommonsLang_thenGetExpectedResult() {
String updatedString = RegExUtils.replacePattern(INPUT_STRING, DIGIT_REGEX, "");
assertEquals(EXPECTED_STRING, updatedString);
}
當我們使用 Apache Commons Lang 時,我們可以用最少的程式碼簡化Strings操作。
3.使用迴圈和StringBuilder
將for迴圈與StringBuilder結合使用提供了一種從String中刪除數字的簡單方法。此方法涉及迭代String中的每個Character ,檢查它是否是數字,然後將非數字Characters附加到StringBuilder :
@Test
void whenUsingForLoop_thenGetExpectedResult() {
StringBuilder sb = new StringBuilder();
for (char ch : INPUT_STRING.toCharArray()) {
if (!Character.isDigit(ch)) {
sb.append(ch);
}
}
assertEquals(EXPECTED_STRING, sb.toString());
}
前面的程式碼示範了一種使用基本循環結構來操作Strings簡單而有效的方法。我們透過手動迭代和附加Characters來獲得對String處理邏輯的細粒度控制。
4. 使用Character Streams
Stream提供了一種現代而簡潔的方式來處理資料集合和序列。我們可以使用Character Streams有效地過濾和操作String中的Characters 。在此範例中,我們使用Stream來刪除String中的所有數字:
@Test
void whenUsingCharacterStream_thenGetExpectedResult() {
String updatedString = INPUT_STRING.chars()
.filter(c -> !Character.isDigit(c))
.mapToObj(c -> (char) c)
.map(String::valueOf)
.collect(Collectors.joining());
assertEquals(EXPECTED_STRING, updatedString);
}
前面的程式碼示範了使用Stream API 為我們的問題創建乾淨高效的解決方案的優雅。
5. 結論
在本文中,我們探索了從Strings中刪除數字的多種方法,包括使用正規表示式與replaceAll()以及Pattern和Matcher類,利用Stream API 實現現代方法,以及使用StringBuilder的傳統for循環以實現清晰和簡單。每種方法都具有獨特的優勢,從正規表示式的強大靈活性到Streams的函數式風格以及循環的簡單本質,為String操作提供了通用的解決方案。
與往常一樣,原始碼可以在 GitHub 上取得。