1. 概述
在这个简短的教程中,我们将学习如何在Java中检查字符串的第一个字符是否是数字。我们将首先探讨使用Java标准库(JDK)的方法,然后看看如何利用Guava等第三方库来实现相同的目标。
2. 使用Java标准库
Java提供了多种方便的方式来检查字符串是否以数字开头。让我们逐一深入了解这些方法。
2.1. 使用 charAt()
最简单的方法是使用charAt()
方法。
首先,我们使用charAt(0)
获取第一个字符:
static boolean checkUsingCharAtMethod(String str) {
if (str == null || str.length() == 0) {
return false;
}
char c = str.charAt(0);
return c >= '0' && c <= '9';
}
在这个例子中,如果指定的字符串为null
或长度为零,我们会返回false
。否则,我们将获取第一个字符并检查它是否是数字。
接下来,我们用一个测试用例来验证这一点:
@Test
void givenString_whenUsingCharAtMethod_thenSuccess() {
assertTrue(FirstCharDigit.checkUsingCharAtMethod("12 years"));
assertFalse(FirstCharDigit.checkUsingCharAtMethod("years"));
assertFalse(FirstCharDigit.checkUsingCharAtMethod(""));
assertFalse(FirstCharDigit.checkUsingCharAtMethod(null));
}
2.2. 使用 Character.isDigit()
Character
类提供了一个名为isDigit()
的便捷方法。顾名思义,它会判断指定字符是否为数字。
让我们看看它是如何工作的:
static boolean checkUsingIsDigitMethod(String str) {
return Character.isDigit(str.charAt(0));
}
我们先使用charAt(0)
获取第一个字符,然后将返回值传递给isDigit()
方法。
现在,让我们用一个测试用例来检验:
@Test
void givenString_whenUsingIsDigitMethod_thenSuccess() {
assertTrue(FirstCharDigit.checkUsingIsDigitMethod("10 cm"));
assertFalse(FirstCharDigit.checkUsingIsDigitMethod("cm"));
assertFalse(FirstCharDigit.checkUsingIsDigitMethod(""));
assertFalse(FirstCharDigit.checkUsingIsDigitMethod(null));
}
2.3. 使用 Pattern
类
另一种方法是使用Pattern
类编译一个正则表达式,用于检查字符串是否以数字开头。
通常,我们可以使用正则表达式"^\\d"
或"^[0-9]"
来匹配以数字开头的字符串。
接下来,我们看看如何使用Pattern
针对给定的字符串编译我们的正则表达式:
static boolean checkUsingPatternClass(String str) {
return Pattern.compile("^[0-9].*")
.matcher(str)
.matches();
}
如图所示,compile()
方法返回一个Matcher
,它提供了matches()
方法。
这个解决方案同样有效,我们在单元测试中可以看到:
@Test
void givenString_whenUsingPatternClass_thenSuccess() {
assertTrue(FirstCharDigit.checkUsingPatternClass("1 kg"));
assertFalse(FirstCharDigit.checkUsingPatternClass("kg"));
assertFalse(FirstCharDigit.checkUsingPatternClass(""));
assertFalse(FirstCharDigit.checkUsingPatternClass(null));
}
2.4. 使用 matches()
方法
检查字符串是否以数字开头的另一种方法是使用matches()
方法,它接受一个正则表达式作为参数。
因此,我们可以重复使用上一个示例中的正则表达式:
static boolean checkUsingMatchesMethod(String str) {
return str.matches("^[0-9].*");
}
现在,让我们添加另一个测试用例来验证我们的方法是否按预期工作:
@Test
void givenString_whenUsingMatchesMethod_thenSuccess() {
assertTrue(FirstCharDigit.checkUsingMatchesMethod("123"));
assertFalse(FirstCharDigit.checkUsingMatchesMethod("ABC"));
assertFalse(FirstCharDigit.checkUsingMatchesMethod(""));
assertFalse(FirstCharDigit.checkUsingMatchesMethod(null));
}
3. 使用Guava
类似地,我们也可以使用Guava库来达到相同的目的。首先,我们需要在pom.xml
文件中添加Guava的依赖项:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
Guava库提供了一系列现成的字符串和字符操作工具类。其中,我们能找到CharMatcher
类。
3.1. 使用 CharMatcher.inRange()
CharMatcher
工具类提供了一个静态方法inRange()
,它匹配给定范围内的任何字符。
这里的主要想法是定义一个只包含数字的范围。
现在,让我们演示CharMatcher.inRange()
的用法:
static boolean checkUsingCharMatcherInRangeMethod(String str) {
return CharMatcher.inRange('0', '9')
.matches(str.charAt(0));
}
请注意,这里的端点'0'
和'9'
都是包括在内的。
一如既往,让我们创建一个测试用例来验证我们的方法:
@Test
void givenString_whenUsingCharMatcherInRangeMethod_thenSuccess() {
assertTrue(FirstCharDigit.checkUsingCharMatcherInRangeMethod("2023"));
assertFalse(FirstCharDigit.checkUsingCharMatcherInRangeMethod("abc"));
assertFalse(FirstCharDigit.checkUsingCharMatcherInRangeMethod(""));
assertFalse(FirstCharDigit.checkUsingCharMatcherInRangeMethod(null));
}
3.2. 使用 CharMatcher.forPredicate()
另一种选择是使用CharMatcher.forPredicate()
来指示给定字符是否为数字。让我们看看它的实际应用:
static boolean checkUsingCharMatcherForPredicateMethod(String str) {
return CharMatcher.forPredicate(Character::isDigit)
.matches(str.charAt(0));
}
简单来说,我们对给定字符串的第一个字符应用了Character::isDigit
谓词。
现在,让我们确认一切正常,通过一个测试用例:
@Test
void givenString_whenUsingCharMatcherForPredicateMethod_thenSuccess() {
assertTrue(FirstCharDigit.checkUsingCharMatcherForPredicateMethod("100"));
assertFalse(FirstCharDigit.checkUsingCharMatcherForPredicateMethod("abdo"));
assertFalse(FirstCharDigit.checkUsingCharMatcherForPredicateMethod(""));
assertFalse(FirstCharDigit.checkUsingCharMatcherForPredicateMethod(null));
}
4. 总结
在这篇短文中,我们学习了检查给定字符串第一个字符是否为数字的各种方法。我们探讨了使用Java标准库的方法,以及如何使用Guava来实现相同的功能。
如往常一样,所有示例的完整源代码可以在GitHub上找到。