在 Java 中檢查字串是否包含數字值
1. 概述
在這篇短文中,我們將重點放在如何在 Java 中檢查字串是否包含數字。
首先,我們將首先考慮使用 JDK 的解決方案。然後,我們將說明如何使用 Guava 和 Apache Commons Lang 等外部函式庫來實現相同的目標。
2.問題介紹
我們這裡的主要目標是檢查字串是否包含數字。因此,基本思想是創建如果給定字串包含數字則返回true
的方法,否則返回false
。
請注意,我們將假設字串非空且非空,以避免重複空和空檢查的樣板程式碼。
3.使用tring
類
String
類別附帶了一組方便的方法,我們可以使用它們來檢查特定字串是否包含數字。
那麼,讓我們仔細看看這些方法。
3.1. tring#matches
方法
引入matches()
方法通常是為了根據正規表示式測試字串。顧名思義,它只是檢查字串是否與給定的正規表示式相符。
簡而言之,我們需要做的就是定義表示「包含數字」的正確正規表示式:
static boolean checkUsingMatchesMethod(String input) {
return input.matches(".*\\d.*");
}
一般來說,我們使用“.*\\d.*”
作為正規表示式來表示字串至少包含一位數字。或者,我們可以將“\\d”
替換為“[0-9]”
,因為它們描述相同的事物(數字/數字) 。
現在,讓我們建立一個測試案例來對我們的方法進行單元測試:
public class StrContainsNumberUtilsUnitTest {
private static final String INPUT_WITH_NUMBERS = "We hope 2024 will be great";
private static final String INPUT_WITHOUT_NUMBERS = "Hello world";
@Test
public void givenInputString_whenUsingMatchesMethod_ThenCheck() {
assertTrue(StrContainsNumberUtils.checkUsingMatchesMethod(INPUT_WITH_NUMBERS));
assertFalse(StrContainsNumberUtils.checkUsingMatchesMethod(INPUT_WITHOUT_NUMBERS));
assertFalse(StrContainsNumberUtils.checkUsingMatchesMethod(""));
assertFalse(StrContainsNumberUtils.checkUsingMatchesMethod(null));
}
}
3.2. tring#replaceAll
方法
我們也可以使用replaceAll()
方法來解決我們的核心問題。它傳回一個字串,替換與指定 regex 相符的所有字元。
這裡的基本想法是使用匹配數字的正規表示式來替換特定字串中的所有數字:
static boolean checkUsingReplaceAllMethod(String input) {
String result = input.replaceAll("\\d", "");
return result.length() != input.length();
}
在這裡,我們用空格替換了所有數字。因此,如果傳回字串的長度與原始字串的長度不同,則輸入將包含數字。
請注意,與replaceAll()
相比, matches()
方法提供了一種更簡潔、更直接的方式來解決我們的核心問題。
現在,讓我們新增一個測試案例來確認一切都按預期工作:
@Test
public void givenInputString_whenUsingReplaceAllMethod_ThenCheck() {
assertTrue(StrContainsNumberUtils.checkUsingReplaceAllMethod(INPUT_WITH_NUMBERS));
assertFalse(StrContainsNumberUtils.checkUsingReplaceAllMethod(INPUT_WITHOUT_NUMBERS));
assertFalse(StrContainsNumberUtils.checkUsingReplaceAllMethod(""));
assertFalse(StrContainsNumberUtils.checkUsingReplaceAllMethod(null));
}
4. 使用Pattern
類
同樣,我們可以使用Pattern
類別來實現相同的目標。此類別提供了一種編譯正規表示式並將其與給定字串進行匹配的便捷方法。
因此,讓我們重複使用在前面的範例中定義的相同正規表示式:
static boolean checkUsingPatternClass(String input) {
return Pattern.compile(".*\\d.*")
.matcher(input)
.matches();
}
簡而言之, compile()
方法允許我們從“.*\\d.*”
表示式建立一個模式。 matcher()
方法建立一個Matcher
對象,該對象可以將我們的輸入與編譯的「包含數字」正規表示式進行匹配。
顧名思義, matches()
方法的功能是檢查我們的輸入是否包含數字。
最後,讓我們為我們的方法添加另一個測試案例:
@Test
public void givenInputString_whenUsingPatternClass_ThenCheck() {
assertTrue(StrContainsNumberUtils.checkUsingPatternClass(INPUT_WITH_NUMBERS));
assertFalse(StrContainsNumberUtils.checkUsingPatternClass(INPUT_WITHOUT_NUMBERS));
assertFalse(StrContainsNumberUtils.checkUsingPatternClass(""));
assertFalse(StrContainsNumberUtils.checkUsingPatternClass(null));
}
5. 使用Character#isDigit
方法
檢查字串是否包含數字的另一種方法是使用Character.isDigit()
方法,該方法確定特定字元是否為數字。
我們可以循環遍歷字串並呼叫isDigit()
來檢查目前字元是否表示數字:
static boolean checkUsingIsDigitMethod(String input) {
for (char c : input.toCharArray()) {
if (Character.isDigit(c)) {
return true;
}
}
return false;
}
現在,我們將建立一個新的測試案例:
@Test
public void givenInputString_whenUsingIsDigitMethod_ThenCheck() {
assertTrue(StrContainsNumberUtils.checkUsingIsDigitMethod(INPUT_WITH_NUMBERS));
assertFalse(StrContainsNumberUtils.checkUsingIsDigitMethod(INPUT_WITHOUT_NUMBERS));
assertFalse(StrContainsNumberUtils.checkUsingIsDigitMethod(""));
assertFalse(StrContainsNumberUtils.checkUsingIsDigitMethod(null));
}
6. 使用串流API
Stream API 提供了一種便捷的方法來檢查給定字串是否包含數字。 Java 8 在String
類別中引入了一個新方法chars()
。此方法傳回一個IntStream
其中保存給定字串中字元的程式碼值。
那麼,讓我們看看它的實際效果:
static boolean checkUsingStreamApi(String input) {
return input.chars()
.anyMatch(Character::isDigit);
}
如上所示,我們使用anyMatch()
方法來檢查任何字元是否代表數字。
像往常一樣,讓我們添加另一個測試案例來確認我們的新方法:
@Test
public void givenInputString_whenUsingStreamApi_ThenCheck() {
assertTrue(StrContainsNumberUtils.checkUsingStreamApi(INPUT_WITH_NUMBERS));
assertFalse(StrContainsNumberUtils.checkUsingStreamApi(INPUT_WITHOUT_NUMBERS));
assertFalse(StrContainsNumberUtils.checkUsingStreamApi(""));
assertFalse(StrContainsNumberUtils.checkUsingStreamApi(null));
}
7. 使用 Apache Commons Lang
此外,我們可以使用 Apache Commons Lang 函式庫來解決這個關鍵問題。但是,我們首先需要將其依賴項新增到pom.xml
中:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.13.0</version>
</dependency>
該函式庫提供了StringUtils
類別來以空安全的方式實作字串操作。該類別附帶getDigits()
方法,該方法從特定字串中提取數字。
那麼,讓我們在實踐中來看看:
static boolean checkUsingApacheCommonsLang(String input) {
String result = StringUtils.getDigits(input);
return result != null && !result.isEmpty();
}
如上所述, getDigits()
傳回一個僅包含數字的新字串。因此,我們需要做的就是檢查傳回的字串是否不為空,以確保我們的輸入包含digits 。
按照通常的方式,讓我們建立一個測試案例:
@Test
public void givenInputString_whenUsingApacheCommonsLang_ThenCheck() {
assertTrue(StrContainsNumberUtils.checkUsingApacheCommonsLang(INPUT_WITH_NUMBERS));
assertFalse(StrContainsNumberUtils.checkUsingApacheCommonsLang(INPUT_WITHOUT_NUMBERS));
assertFalse(StrContainsNumberUtils.checkUsingApacheCommonsLang(""));
assertFalse(StrContainsNumberUtils.checkUsingApacheCommonsLang(null));
}
8. 使用番石榴
如果我們想檢查給定的字串是否包含數字,Guava 庫是另一個可以考慮的選擇。讓我們先將其依賴項新增到我們的pom.xml
中:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
接下來,讓我們來看一個使用 Guava 函式庫的簡單範例:
static boolean checkUsingGuava(String input) {
String result = CharMatcher.forPredicate(Character::isDigit)
.retainFrom(input);
return !result.isEmpty();
}
Guava 提供了CharMatcher()
類別來操作字元。在這裡,我們使用forPredicate()
方法僅過濾數字,並使用retainfrom()
方法傳回它們。
最後,我們將為我們的方法添加一個新的測試案例:
@Test
public void givenInputString_whenUsingGuava_ThenCheck() {
assertTrue(StrContainsNumberUtils.checkUsingGuava(INPUT_WITH_NUMBERS));
assertFalse(StrContainsNumberUtils.checkUsingGuava(INPUT_WITHOUT_NUMBERS));
assertFalse(StrContainsNumberUtils.checkUsingGuava(""));
assertFalse(StrContainsNumberUtils.checkUsingGuava(null));
}
9. 結論
在本教程中,我們探索了在 Java 中檢查字串是否包含數字的多種方法。
首先,我們研究了使用 JDK 實現此目的的一些方法。然後,我們展示瞭如何使用幾個第三方函式庫來應對我們的核心挑戰。
與往常一樣,本文中使用的程式碼可以在 GitHub 上找到。