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上找到。