1. 概述
在这个教程中,我们将探讨在字符串中找到第一个整数出现的各种方法。例如,给定字符串"ba31dung123"
,我们只想找到嵌入的第一个整数,即31
。我们将使用正则表达式和纯Java语言来展示如何实现。
2. 使用正则表达式的解决方案
正则表达式(Regex)是根据特定模式匹配和操作字符串的强大工具。 它提供了一种简洁的方式来指定字符串模式,我们可以用它来搜索特定字符、单词或短语,替换文本,并根据特定规则验证字符串。
2.1. 使用Matcher
和Pattern
类
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
变量中存储第一个数字的索引。然后,我们再次遍历,直到找到数字的结束(等于第一个非数字字符)。然后我们可以返回从i
到j
的子串。
让我们测试我们的findFirstInteger()
方法:
@Test
void whenUsingCustomMethod_findFirstInteger() {
String str = "ba31dung123";
Integer i = FirstOccurrenceOfAnInteger.findFirstInteger(str);
Assertions.assertEquals(31, i);
}
4. 总结
在这篇简短的文章中,我们探讨了从字符串中提取第一个嵌入整数的不同方法。我们看到正则表达式在这个任务中有多种应用,但不依赖它也能完成。如往常一样,示例代码的源码可以在GitHub上找到。