Java提取字符串中所有数字的核心方法有三种:正则匹配(推荐,可提取连续数字子串或单个数字字符)、for循环遍历(兼容性好、逻辑清晰)、Stream流处理(简洁,适合单个数字字符提取);需注意Character.isDigit()更安全,且连续数字与单个数字场景需选用不同策略。

Java 提取字符串中所有数字,核心思路是遍历字符、判断是否为数字字符(0–9),再拼接或收集。常用方法有正则匹配、循环遍历、Stream 流处理三种,按场景选择即可。
用正则表达式提取全部数字(推荐)
最简洁高效的方式是用 Pattern 和 Matcher 找出所有连续数字片段(如 "abc123def45" → ["123", "45"]),或用 replaceAll 提取所有单个数字字符(如 → "12345"):
- 提取所有**连续数字子串**(保留多位数):
String str = "价格:¥129.99,库存87件,编号A-2024-B001";
Pattern pattern = Pattern.compile("\d+");
Matcher matcher = pattern.matcher(str);
List<String> numbers = new ArrayList<>();
while (matcher.find()) {
numbers.add(matcher.group()); // ["129", "99", "87", "2024", "001"]
}
- 提取所有**单个数字字符**并拼成一个字符串(忽略分组):
String onlyDigits = str.replaceAll("[^0-9]", ""); // "12999872024001"
用 for 循环逐字符判断(兼容性好,逻辑清晰)
适合需要精细控制(比如跳过小数点、保留负号等)或运行环境受限(如 Android API 级别低)的场景:
- 提取所有数字字符(0–9),拼成字符串:
StringBuilder digits = new StringBuilder();
for (char c : str.toCharArray()) {
if (Character.isDigit(c)) {
digits.append(c);
}
}
String result = digits.toString(); // "12999872024001"
- 若想保留带符号/小数的数字(如 "-12.34"),需额外解析逻辑,不能仅靠 isDigit。
用 Java 8+ Stream(函数式写法,一行可搞定)
代码简洁,适合简单提取单个数字字符:
立即学习“Java免费学习笔记(深入)”;
String result = str.chars()
.filter(Character::isDigit)
.collect(StringBuilder::new,
(sb, c) -> sb.append((char) c),
StringBuilder::append)
.toString();
注意:Stream 不适合直接提取连续数字块(如把 "123" 当整体),仍需正则配合。
常见误区提醒
- Character.isDigit() 比 c >= '0' && c :它支持 Unicode 数字(如阿拉伯数字),而后者只认 ASCII '0'–'9'。
- 正则 "\d" 在某些模式下可能匹配全角数字或其它 Unicode 数字;如需严格 ASCII,用 "[0-9]"。
- 如果目标是提取“数值”(如浮点数、负数),不是“数字字符”,应使用 Scanner 或自定义解析器,而非简单正则。


















