最直接方式是用正则/\d+/g配合match()提取连续数字;需判空并可用map(Number)转数值;单数字用/\d/g;负数小数需更复杂正则并过滤验证。

用正则表达式配合 match() 方法,是最直接、常用的方式。
使用 match() 提取所有数字(包括多位数)
匹配连续的数字字符(即自然数),用全局标志 g:
const str = "abc123def45gh6i789"; const numbers = str.match(/\d+/g); // ["123", "45", "6", "789"]
注意:\d+ 匹配一个或多个连续数字,能正确提取完整数字,而不是单个数字字符。
- 如果字符串中没有数字,
match()返回null,建议加空值判断 - 结果是字符串数组,如需数值类型,可后续用
map(Number)转换
只提取单个数字字符(0–9)
若只需要每个独立数字字符(比如“a1b2c3” → [1,2,3]),用 \d 不加 +:
立即学习“Java免费学习笔记(深入)”;
const str = "a1b2c3"; const digits = str.match(/\d/g)?.map(Number) || []; // [1, 2, 3]
这里用了可选链 ?.map() 和空值合并 || [],避免 null 报错。
处理带符号或小数的数字(进阶)
标准 \d+ 无法匹配负数、小数(如 -12.34)。可改用更全面的正则:
const str = "温度:-5.6℃,湿度:78.5%,编号:abc123";
const floats = str.match(/-?\d+\.?\d*/g); // ["-5.6", "78.5", "123"]
// 过滤掉无效项(如 "." 或 "78.")
const validNumbers = floats
?.filter(s => /^-?\d+\.?\d+$/.test(s) && !s.endsWith('.'))
.map(Number) || [];
这个正则仍有一定局限(比如不支持科学计数法),如需高精度解析,建议结合专门的解析库或分步校验。
兼容性与替代方案(无正则)
极简场景下可遍历字符串手动判断:
const str = "x1y2z3.4";
const numbers = [];
let current = "";
for (const char of str) {
if (/\d/.test(char)) {
current += char;
} else if (current) {
numbers.push(current);
current = "";
}
}
if (current) numbers.push(current); // 收尾
// numbers → ["1", "2", "3"]
这种方式逻辑清晰、不依赖正则,但代码量多,一般推荐优先用 match()。


















