1. 概述

在这个教程中,我们将探讨在字符串中找到第一个整数出现的各种方法。例如,给定字符串"ba31dung123",我们只想找到嵌入的第一个整数,即31。我们将使用正则表达式和纯Java语言来展示如何实现。

2. 使用正则表达式的解决方案

正则表达式(Regex)是根据特定模式匹配和操作字符串的强大工具。 它提供了一种简洁的方式来指定字符串模式,我们可以用它来搜索特定字符、单词或短语,替换文本,并根据特定规则验证字符串。

2.1. 使用MatcherPattern

java.util.regex包提供了两种主要的正则表达式匹配类:

  • Matcher这个类提供了使用给定模式对字符串进行各种匹配操作的方法。 它通过调用Pattern实例的matcher()方法获取。
  • Pattern这个类表示编译后的正则表达式,并提供了在字符串上执行匹配操作的各种方法。 我们可以通过调用Pattern类的compile()方法从一个正则表达式创建模式。

我们可以利用它们在字符串中查找第一个整数:

@Test
void whenUsingPatternMatcher_findFirstInteger() {
    String str = "ba31dung123";
    Matcher matcher = Pattern.compile("\\d+").matcher(str);
    matcher.find();
    int i = Integer.valueOf(matcher.group());
    Assertions.assertEquals(31, i);
}

我们使用表达式\d+来匹配一个或多个连续的数字。

2.2. 使用Scanner

我们还可以使用java.util.Scanner类。 这是一个强大的数据解析工具。首先,我们会使用其useDelimiter()方法移除所有非数字。然后,我们可以使用nextInt()方法逐一提取数字:

@Test
void whenUsingScanner_findFirstInteger() {
    int i = new Scanner("ba31dung123").useDelimiter("\\D+").nextInt();
    Assertions.assertEquals(31, i);
}

正则表达式\D+表示所有连续的非数字字符(与\d+相反)。

2.3. 使用split()方法

Java中的String类方法split()将字符串根据指定的分隔符分割成子字符串,并返回一个子字符串数组。 分隔符可以是正则表达式或普通字符串:

@Test
void whenUsingSplit_findFirstInteger() {
    String str = "ba31dung123";
    List<String> tokens = Arrays.stream(str.split("\\D+")).filter(s -> s.length() > 0).collect(Collectors.toList());
    Assertions.assertEquals(31, Integer.parseInt(tokens.get(0)));
}

我们使用了先前相同的正则表达式。但是,这种解决方案如果字符串以分隔符开头,可能会给我们一个空的数组元素。因此,我们需要使用Java流API和filter()方法来避免这种情况。

3. 不使用正则表达式的解决方案

我们已经看到正则表达式是一个很好的解决方案,但不使用它们也可以完成这项任务。

让我们创建一个方法来提取字符串中的第一个整数:

static Integer findFirstInteger(String s) {
    int i = 0;
    while (i < s.length() && !Character.isDigit(s.charAt(i))) {
        i++;
    }
    int j = i;
    while (j < s.length() && Character.isDigit(s.charAt(j))) {
        j++;
    }
    return Integer.parseInt(s.substring(i, j));
}

我们从遍历字符串开始,直到找到第一个数字。然后我们使用isDigit()方法识别数字字符。 接着,我们在i变量中存储第一个数字的索引。然后,我们再次遍历,直到找到数字的结束(等于第一个非数字字符)。然后我们可以返回从ij的子串。

让我们测试我们的findFirstInteger()方法:

@Test
void whenUsingCustomMethod_findFirstInteger() {
    String str = "ba31dung123";
    Integer i = FirstOccurrenceOfAnInteger.findFirstInteger(str);
    Assertions.assertEquals(31, i);
}

4. 总结

在这篇简短的文章中,我们探讨了从字符串中提取第一个嵌入整数的不同方法。我们看到正则表达式在这个任务中有多种应用,但不依赖它也能完成。如往常一样,示例代码的源码可以在GitHub上找到。